沉浸式学习PostgreSQL|PolarDB 17: 向量数据库, 通义大模型AI的外脑

简介: chatbot是大模型应用之一, 在与chatbot沟通时会遇到token上限问题, 例如通义目前是8K, chatgpt是4K. 也就是问题上下文(包含多轮对话的内容)最多8k或4k, 超出就无法处理了.解释一下token: 对于通义模型来说, 中文字符串的token就是字数(含符号). 英文则可能是词、片段等.我们的核心目的是通过有限的上下文来拿到结果.这就需要你的prompt(上下文)足够精确, 防止无效垃圾对话浪费token限额.上下文的组成:1、每一轮对话的提问内容和大模型的回答内容2、外脑中的FAQ这个实验体验的就是怎么建设AI的外脑?向量数据库的核心价值:AI外脑
+关注继续查看

作者

digoal

日期

2023-09-22

标签

PostgreSQL , PolarDB , 数据库 , 教学


背景

欢迎数据库应用开发者参与贡献场景, 在此issue回复即可, 共同建设《沉浸式数据库学习教学素材库》, 帮助开发者用好数据库, 提升开发者职业竞争力, 同时为企业降本提效.

  • 系列课程的核心目标是教大家怎么用好数据库, 而不是怎么运维管理数据库、怎么开发数据库内核. 所以面向的对象是数据库的用户、应用开发者、应用架构师、数据库厂商的产品经理、售前售后专家等角色.

本文的实验可以使用永久免费的阿里云云起实验室来完成.

如果你本地有docker环境也可以把镜像拉到本地来做实验:

x86_64机器使用以下docker image:

ARM机器使用以下docker image:

业务场景1 介绍: 向量数据库, 作为通义AI的外脑设计

chatbot是大模型应用之一, 在与chatbot沟通时会遇到token上限问题, 例如通义目前是8K, chatgpt是4K. 也就是问题上下文(包含多轮对话的内容)最多8k或4k, 超出就无法处理了.

解释一下token: 对于通义模型来说, 中文字符串的token就是字数(含符号). 英文则可能是词、片段等.

我们的核心目的是通过有限的上下文来拿到结果.

这就需要你的prompt(上下文)足够精确, 防止无效垃圾对话浪费token限额.

上下文的组成:

1、每一轮对话的提问内容和大模型的回答内容

2、外脑中的FAQ

这个实验要体验的就是怎么建设AI的外脑?

向量数据库的核心价值:

  • AI的外脑.

参考知识:

实现和对照

传统方法 设计和实验

传统数据库不支持向量, 略.

PolarDB|PG新方法1 设计和实验

上一个实验比较简单, 大家应该体验到了通义大模型可以干什么? 在阿里云可以使用plpython3u来调用灵积里面的诸多大模型能力, 玩法参考:

同时大家也可以思考一下向量数据库到底能干什么?

进入实验环境容器.

安装python sdk:

pip install dashscope

创建一个保存api key的文件:

请把以下API-KEY代替成你申请的api-key.

su - postgres    
mkdir ~/.dashscope    
echo "API-KEY" > ~/.dashscope/api_key    
chmod 500 ~/.dashscope/api_key

连接到数据库shell, 创建plpython3u插件, 让你的PG|PolarDB支持python3编写数据库函数和存储过程.

psql  
  
create extension plpython3u;

1、创建chat函数, 让数据库支持单轮对话和提示对话.

单轮对话:

create or replace function chat (sys text, u text) returns text as $$    
    
#coding:utf-8    
from http import HTTPStatus    
from dashscope import Generation    
    
messages = [{'role': 'system', 'content': sys}]  
  
messages.append({'role': 'user', 'content': u})  
  
gen = Generation()    
response = gen.call(    
    Generation.Models.qwen_plus,    
    messages=messages,    
    result_format='message', # set the result is message format.    
)    
if response.status_code == HTTPStatus.OK:       
    return (response)     
else:    
    return('Request id: %s, Status code: %s, error code: %s, error message: %s'%(    
        response.request_id, response.status_code,     
        response.code, response.message    
    ))         
    
$$ language plpython3u strict;

多轮提示对话(使用两个长度相等的数组, 作为多轮问题和答案的输入):

create or replace function chat (sys text, u text, u_hist text[], ass_hist text[]) returns text as $$    
    
#coding:utf-8    
from http import HTTPStatus    
from dashscope import Generation    
    
messages = [{'role': 'system', 'content': sys}]  
  
if (len(u_hist) >=1):  
    for v in range(0,len(u_hist)):  
        messages.extend((  
            {'role': 'user', 'content': u_hist[v]},   
            {'role': 'assistant', 'content': ass_hist[v]}  
        ))  
  
messages.append({'role': 'user', 'content': u})  
  
gen = Generation()    
response = gen.call(    
    Generation.Models.qwen_plus,    
    messages=messages,    
    result_format='message', # set the result is message format.    
)    
if response.status_code == HTTPStatus.OK:       
    return (response)     
else:    
    return('Request id: %s, Status code: %s, error code: %s, error message: %s'%(    
        response.request_id, response.status_code,     
        response.code, response.message    
    ))         
    
$$ language plpython3u strict;

第一次调用, 使用单轮对话接口:

select * from chat ('你是通义千问机器人', '附近有什么好玩的吗');  
  
-[ RECORD 1 ]-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------  
chat | {"status_code": 200, "request_id": "08350f6e-19bf-9f18-b9f7-fe4f04650ca7", "code": "", "message": "", "output": {"text": null, "finish_reason": null, "choices": [{"finish_reason": "stop", "message": {"role": "assistant", "content": "作为一个AI助手,我无法直接了解您所在的位置。但您可以尝试使用手机地图或旅游APP查找附近的景点、公园、商场等娱乐场所。您也可以问问当地的居民或朋友,了解他们推荐的好玩的地方。祝您玩得愉快!"}}]}, "usage": {"input_tokens": 18, "output_tokens": 86, "total_tokens": 104}}

第二次调用, 使用多轮对话接口, 带上之前的问题和回答

select * from chat (  
  '你是通义千问机器人',   
  '我在杭州市西湖区阿里云云谷园区',  
  array['附近有什么好玩的吗'],   
  array['作为一个AI助手,我无法直接了解您所在的位置。但您可以尝试使用手机地图或旅游APP查找附近的景点、公园、商场等娱乐场所。您也可以问问当地的居民或朋友,了解他们推荐的好玩的地方。祝您玩得愉快!']  
);  
  
  
-[ RECORD 1 ]-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------  
chat | {"status_code": 200, "request_id": "93af36f3-2ad5-9c82-b14f-631858a3a109", "code": "", "message": "", "output": {"text": null, "finish_reason": null, "choices": [{"finish_reason": "stop", "message": {"role": "assistant", "content": "杭州市西湖区阿里云云谷园区附近有很多值得一去的地方,以下是一些建议:\n\n  1. 西湖:杭州的标志性景点,被誉为“人间天堂”,可以欣赏到美丽的湖光山色。\n  2. 西溪湿地:一个大型的湿地公园,有着丰富的自然生态和美丽的景色。\n  3. 西湖文化广场:一个集文化、娱乐、购物于一体的综合性广场,有着丰富的文化活动和商业设施。\n  4. 龙井茶园:位于西湖区,是中国著名的龙井茶产地,可以品尝到正宗的龙井茶。\n  5. 浙江省博物馆:位于西湖区,是一座大型的博物馆,展示了浙江省的历史文化和艺术品。\n\n希望这些建议能帮到您,祝您玩得愉快!"}}]}, "usage": {"input_tokens": 119, "output_tokens": 248, "total_tokens": 367}}

第三次调用, 使用多轮对话接口, 继续补上之前交流的内容

select * from chat (  
  '你是通义千问机器人',   
  '我想去找个足浴店, 需要正规绿色并且口碑好的',  
  array['附近有什么好玩的吗', '我在杭州市西湖区阿里云云谷园区'],   
  array['作为一个AI助手,我无法直接了解您所在的位置。但您可以尝试使用手机地图或旅游APP查找附近的景点、公园、商场等娱乐场所。您也可以问问当地的居民或朋友,了解他们推荐的好玩的地方。祝您玩得愉快!', '杭州市西湖区阿里云云谷园区附近有很多值得一去的地方,以下是一些建议:\n\n  1. 西湖:杭州的标志性景点,被誉为“人间天堂”,可以欣赏到美丽的湖光山色。\n  2. 西溪湿地:一个大型的湿地公园,有着丰富的自然生态和美丽的景色。\n  3. 西湖文化广场:一个集文化、娱乐、购物于一体的综合性广场,有着丰富的文化活动和商业设施。\n  4. 龙井茶园:位于西湖区,是中国著名的龙井茶产地,可以品尝到正宗的龙井茶。\n  5. 浙江省博物馆:位于西湖区,是一座大型的博物馆,展示了浙江省的历史文化和艺术品。\n\n希望这些建议能帮到您,祝您玩得愉快!']  
);  
  
-[ RECORD 1 ]-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------  
chat | {"status_code": 200, "request_id": "520e9c40-852b-9256-b1a1-10e7cea36531", "code": "", "message": "", "output": {"text": null, "finish_reason": null, "choices": [{"finish_reason": "stop", "message": {"role": "assistant", "content": "作为一个AI助手,我无法直接推荐具体的足浴店。但您可以通过以下几种方式寻找正规、绿色并且口碑好的足浴店:\n\n  1. 在网上搜索评价:您可以在搜索引擎或者相关的点评网站上搜索附近的足浴店,查看其他消费者的评价和口碑,选择评价较高的店铺。\n  2. 向当地居民或朋友咨询:您可以向当地的居民或朋友咨询他们推荐的足浴店,了解他们的服务质量和口碑。\n  3. 查看相关资质:在选择足浴店时,可以查看店铺的相关资质,如营业执照、卫生许可证等,确保店铺是正规合法的。\n\n希望这些建议能帮到您,祝您找到满意的足浴店并享受愉快的时光!"}}]}, "usage": {"input_tokens": 397, "output_tokens": 232, "total_tokens": 629}}

准备第四次调用.

第三轮的答案不理想, 需要给机器人一点提示, 假设我的数据库中有足浴店及其地址, 并且已经将其转换成了embedding向量, 那么我可以先通过足浴店这个关键字进行向量近似搜索, 假设搜索到了

尚沐汇影院式足道在哪里: 浙江省杭州市余杭区五常街道荆长路768号顺帆科技园

那么我们就可以把这一对信息放入多轮对话中, 生成下面的调用: `

select * from chat (  
  '你是通义千问机器人',   
  '我想去找个足浴店, 需要正规绿色并且口碑好的',  
  array['附近有什么好玩的吗', '我在杭州市西湖区阿里云云谷园区','尚沐汇影院式足道在哪里'],   
  array['作为一个AI助手,我无法直接了解您所在的位置。但您可以尝试使用手机地图或旅游APP查找附近的景点、公园、商场等娱乐场所。您也可以问问当地的居民或朋友,了解他们推荐的好玩的地方。祝您玩得愉快!', '杭州市西湖区阿里云云谷园区附近有很多值得一去的地方,以下是一些建议:\n\n  1. 西湖:杭州的标志性景点,被誉为“人间天堂”,可以欣赏到美丽的湖光山色。\n  2. 西溪湿地:一个大型的湿地公园,有着丰富的自然生态和美丽的景色。\n  3. 西湖文化广场:一个集文化、娱乐、购物于一体的综合性广场,有着丰富的文化活动和商业设施。\n  4. 龙井茶园:位于西湖区,是中国著名的龙井茶产地,可以品尝到正宗的龙井茶。\n  5. 浙江省博物馆:位于西湖区,是一座大型的博物馆,展示了浙江省的历史文化和艺术品。\n\n希望这些建议能帮到您,祝您玩得愉快!','浙江省杭州市余杭区五常街道荆长路768号顺帆科技园']  
);  
  
  
  
-[ RECORD 1 ]------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------  
chat | {"status_code": 200, "request_id": "03e53792-1895-9ff9-9986-046493674b6b", "code": "", "message": "", "output": {"text": null, "finish_reason": null, "choices": [{"finish_reason": "stop", "message": {"role": "assistant", "content": "以下是一些在杭州口碑较好的足浴店,供您参考:\n\n  1. 杭州和平足道:位于杭州市下城区,环境优雅,服务专业,口碑较好。\n  2. 杭州绿康足道:位于杭州市拱墅区,设施齐全,服务周到,价格适中。\n  3. 杭州华夏足道:位于杭州市江干区,装修豪华,技师专业,口碑较好。\n  4. 杭州名流足道:位于杭州市萧山区,环境优雅,服务一流,价格适中。\n\n请注意选择正规、绿色的足浴店,确保自身安全和健康。祝您享受愉快的足浴体验!"}}]}, "usage": {"input_tokens": 433, "output_tokens": 191, "total_tokens": 624}}

以此类推, 当我们发现机器人的回答不是特别准确时, 尽快给出提示.

这个提示就是我们之前一直在说的, 通过将垂直内容输入本地向量数据库, 将近似问题作为prompt来提升AI精准度的方法.

create table tbl_faq(  
  id int primary key,  
  f text,  -- 问题
  q text,  -- 回答
  faq_tokens int,  -- f+q 的token数. 
  embedding vector  -- faq 的向量值, 调用大模型可以将text文本转换为向量, 参考第16个实验
);  
  
create index on tbl_faq using hnsw (embedding);

将有价值的内容输入到tbl_faq表. 例如企业知识库, 数据库应用实践文档.

获取与‘关键字’ 相关的近似问题, 作为prompt来提升AI精准度的方法.

select f,q from tbl_faq order by '关键字' <-> embedding limit 2;

除了之前的问答内容, 再将以上请求得到的 f,q 分别塞入array1, array2.

select * from chat (  
  '你是通义千问机器人',   
  '我想去找个足浴店, 需要正规绿色并且口碑好的',  
  array1, array2);

对照

通过好的prompt, 向量数据库可以让 AI更好的发挥能力. 所以把向量数据库称之为AI外脑不为过.

前提是, 你已经将已有的知识提炼成FAQ, 并存储在向量数据库中.

知识点

token

向量

prompt

会话token上限: 问题+即将得到的回复 总的token不能超过这个上限

hnsw

PolarDB|PostgreSQL有哪些向量插件?

思考

如何建设好向量数据库的内容.

参考

参考知识:

相关实践学习
使用CLup和iSCSI共享盘快速体验PolarDB for PostgtreSQL
在Clup云管控平台中快速体验创建与管理在iSCSI共享盘上的PolarDB for PostgtreSQL。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
目录
相关文章
|
28天前
|
人工智能 搜索推荐 云栖大会
什么是通义智文?AI阅读助手,用AI帮你读得多、读得快、读得懂
什么是通义智文?AI阅读助手,用AI帮你读得多、读得快、读得懂
50663 9
|
2月前
|
人工智能 关系型数据库 Serverless
|
2月前
|
人工智能 关系型数据库 分布式数据库
沉浸式学习PostgreSQL|PolarDB 16: 植入通义千问大模型+文本向量化模型, 让数据库具备AI能力
开源大模型非常多, 但都需要大算力才能高效发挥大模型能力, 训练专业大模型. 普通企业很难构建及训练大模型. 为让大模型普惠企业及大众需求, 阿里云推出DashScope灵积:模型集市, 每个模型独有特点, 每一种模型都提供API接口, 任何人都可以调用大模型的算力. 什么和大模型结合将发挥重大的价值? 毫无疑问是数据. 1、通过数据来训练大模型. 2、通过大模型分析数据, 帮助企业进行决策. 3、通过大模型理解数据, 例如帮助企业解决客户和伙伴提出的问题, 提升产品体验. 这个实验将带领大家来体验一下如何将“千问大模型+文本向量化模型”植入到PG|PolarDB中, 让数据库具备AI能力.
22864 17
沉浸式学习PostgreSQL|PolarDB 16: 植入通义千问大模型+文本向量化模型, 让数据库具备AI能力
|
2月前
|
人工智能 关系型数据库 Serverless
探索AI知识库问答应用:函数计算与RDS PostgreSQL的奇妙融合
随着技术的飞速发展,AI大语言模型成为了当今科技界的一颗璀璨明星。我有幸跟随老陈的引导,踏入了基于函数计算(FC)和RDS PostgreSQL的AI知识库问答应用的世界。这次的探索让我深切感受到了云计算和人工智能的结合,以及它们如何塑造着未来的技术格局。
|
2月前
|
人工智能 关系型数据库 分布式数据库
沉浸式学习PostgreSQL|PolarDB 9: AI大模型+向量数据库, 提升AI通用机器人在专业领域的精准度, 完美诠释柏拉图提出的“知识是回忆而不是知觉”
越来越多的企业和个人希望能够利用LLM和生成式人工智能来构建专注于其特定领域的具备AI能力的产品。目前,大语言模型在处理通用问题方面表现较好,但由于训练语料和大模型的生成限制,对于垂直专业领域,则会存在知识深度和时效性不足的问题。在信息时代,由于企业的知识库更新频率越来越高,并且企业所拥有的垂直领域知识库(例如文档、图像、音视频等)往往是未公开或不可公开的。因此,对于企业而言,如果想在大语言模型的基础上构建属于特定垂直领域的AI产品,就需要不断将自身的知识库输入到大语言模型中进行训练。
634 0
|
4月前
|
人工智能 自然语言处理 关系型数据库
用PolarDB|PostgreSQL提升通用ai机器人在专业领域的精准度
chatgpt这类通用机器人在专业领域的回答可能不是那么精准, 原因有可能是通用机器人在专业领域的语料库学习有限, 或者是没有经过专业领域的正反馈训练. 为了提升通用机器人在专业领域的回答精准度, 可以输入更多专业领域相似内容作为prompt来提升通用ai机器人在专业领域的精准度. PolarDB | PostgreSQL 开源数据库在与openai结合的过程中起到的核心作用是: 基于向量插件的向量类型、向量索引、向量相似搜索操作符, 加速相似内容的搜索. 通过“问题和正确答案”作为参考输入, 修正openapi在专业领域的回答精准度.
52145 33
用PolarDB|PostgreSQL提升通用ai机器人在专业领域的精准度
|
4月前
|
人工智能 API C++
【AI绘画大比拼】通义万相VS文心一格:探索十种风格下的绘画生成差异!
近日,通义大模型家族的新成员——通义万相已在人工智能大会上亮相。其中,通义万相的强大的“文生图”功能,不禁让我想到了去年八月由百度依托飞桨、文心大模型的技术创新推出的“AI作画”首款产品——文心一格。 那么,在类似的Prompt下,两款产品的表现将会如何呢?今天就让我们就十种风格下二者生成图像的表现力,来看看这两款产品的差异。
|
4月前
|
人工智能 搜索推荐
‘通义万相’使用体验——令人惊艳的AI绘画创作大模型
7月7日,阿里云在2023世界人工智能大会上宣布,AI绘画创作大模型通义万相开启定向邀测。通义万相是阿里云“通义”大模型系列第三个产品,此前的通义千问、通义听悟分别具备文字问答和语音文字处理的功能。目前该模型已经开启定向邀测.
|
5月前
|
Web App开发 人工智能 城市大脑
阿里云AI新品“通义听悟”,开放公测!
阿里云AI新品“通义听悟”,开放公测!
759 0
|
5月前
|
人工智能 达摩院 自然语言处理
让AI更通用的“通义”大模型,来了!
让AI更通用的“通义”大模型,来了!
384 0
热门文章
最新文章
相关产品
云数据库 RDS PostgreSQL 版
推荐文章
更多