收录专栏:PolarDB for PostgreSQL,后续将会发布PolarDB for PostgreSQL教程,大家感兴趣的话可以点个订阅呀!
简介: chatgpt这类通用机器人在专业领域的回答可能不是那么精准, 原因有可能是通用机器人在专业领域的语料库学习有限, 或者是没有经过专业领域的正反馈训练. 为了提升通用机器人在专业领域的回答精准度, 可以输入更多专业领域相似内容作为prompt来提升通用ai机器人在专业领域的精准度. PolarDB | PostgreSQL 开源数据库在与openai结合的过程中起到的核心作用是: 基于向量插件的向量类型、向量索引、向量相似搜索操作符, 加速相似内容的搜索. 通过“问题和正确答案”作为参考输入, 修正openapi在专业领域的回答精准度.
背景
chatgpt这类通用机器人在专业领域的回答可能不是那么精准, 原因有可能是通用机器人在专业领域的语料库学习有限, 或者是没有经过专业领域的正反馈训练.
为了提升通用机器人在专业领域的回答精准度, 可以输入更多专业领域相似内容作为prompt来提升通用ai机器人在专业领域的精准度.
- 参考openai文档. How do I create a good prompt? | OpenAI Help Center
PolarDB | PostgreSQL 开源数据库在与openai结合的过程中起到的核心作用是什么?
基于向量插件的向量类型、向量索引、向量相似搜索操作符, 加速相似内容的搜索. 通过“问题和正确答案”作为参考输入, 修正openapi在专业领域的回答精准度.
基本步骤讲解
1、准备:
- PolarDB | PostgreSQL 开源数据库
- plpython3u 函数插件 以及 python openai 包
- 向量插件 (pgvector, hnsw, embedding等插件都可以)
- openai 账号
- 参考文档库素材
2、建设专业领域的“参考文档库”, 问题+答案的格式. 这一步可能是人肉工作, 比如从文档提炼成“问题+答案”的格式. 例如:
- 问题: 如何使用PolarDB的eqp功能实现多机并行计算?
- 答案: 以htap模式构建PolarDB集群, 配置xxx相关并行参数, explain sql 观察执行计划, 执行sql; (实际情况你可以写得更详细一些.)
3、创建向量插件
4、创建openai的辅助参考表, 包括“问题文本、问题向量、答案文本”几个字段. 你可以理解为“正确答案”(或者prompt).
5、将"参考文档库"导入数据库, 并调用openai得到辅助参考表“问题文本字段对应的vector值, 1536维度的向量”写入到辅助参考表.
6、创建辅助参考表vector字段的向量索引.
7、在用户向openai问非常专业的问题时,
将“用户输入的问题1”抛给openai得到“向量值1”,
- 这一步的tiktoken过程介绍:- 《PostgreSQL 或PolarDB 使用插件pg_tiktoken - 使用 OpenAI tiktoken库文本向量化(tokenization) - 使用分词算法BPE - NLP 自然语言处理》
使用“向量值1”搜索辅助参考表, 找到最相似的“向量2”(这一步就是向量检索, 可以用到向量索引), 取出与之相对应的“问题和答案”, (这一步可以设置阈值, 如果没有特别相似的就不要了.)
将“用户输入的问题1 + 最相似问题和答案(如果有)”输入, 向openai提问, 从而修正直接向openai问“用户输入的问题1”的结果. 提升openai专业领域回答的准确度.
Demo 演示
1、通过云起实验启动数据库, 这个实验室是永久免费的.
- 快速体验PolarDB开源数据库 - 云起实验室-在线实验-上云实践-阿里云开发者社区-阿里云官方实验平台-阿里云
参考:
创建并启动容器
docker run -d -it --cap-add=SYS_PTRACE --cap-add SYS_ADMIN --privileged=true --name pg registry.cn-hangzhou.aliyuncs.com/digoal/opensource_database:pg14_with_exts
进入容器
docker exec -ti pg bash
连接数据库
psql
这个容器支持如下相似搜索插件, 接下来的例子使用pgvector插件, 如果向量文本特别多, 建议使用hnsw或pg_embedding插件.
- similarity, 近似算法, 类型+索引
- imgsmlr, 图像搜索, 类型+索引
- pgvector, 向量搜索, 类型+索引(ivfflat)
- hnsw, 向量搜索, 类型+索引(hnsw)
- pg_embedding, 向量搜索, 类型+索引(hnsw)
2、创建插件以及 python openai 包
# apt install -y python3-pip
# pip3 install openai
root@689ed216de12:/tmp# psql
psql (14.8 (Debian 14.8-1.pgdg110+1))
Type "help" for help.
postgres=# create extension plpython3u ;
CREATE EXTENSION
postgres=# create extension vector ;
CREATE EXTENSION
3、准备"参考文档库", 你可以理解为“正确答案”.
4、创建openai的辅助参考表, 包括“问题文本、问题向量、答案文本”几个字段.
create table tbl_faq (
id serial8 primary key,
f text, -- 问题
q text, -- 标准答案
v vector(1536) -- faq (textcat('title: '||f, ' --- '||q)) 文本向量
);
5、将"参考文档库"导入数据库, 并调用openai得到辅助参考表“问题文本字段对应的vector值, 1536维度的向量”写入到辅助参考表.
直接update全表的话容易造成表膨胀, 建议从外面的文件导入的过程中调用openai实时计算vector值并导入.
配置环境变量(启动数据库时的环境变量OPENAI_API_KEY. 用于存储openai key, 当然你也可以使用其他方式获取key, 改写下列function即可.)
create or replace function get_v (faq text) returns vector as $$
import openai
import os
text = faq
openai.api_key = os.getenv("OPENAI_API_KEY")
response = openai.Embedding.create(
model = "text-embedding-ada-002",
input = text.replace("\n", " ")
)
embedding = response['data'][0]['embedding']
return embedding
$$ language plpython3u;
insert into tbl_faq(f,q,v) select f,q,get_v(textcat('title: '||f, ' --- '||q)) from 外部表;
6、创建辅助参考表vector字段的向量索引.
create index on tbl_faq using ivfflat (v vector_cosine_ops);
analyze tbl_faq;
7、在用户向openai问非常专业的问题时:
将“用户输入的问题1”抛给openai得到“向量值1”,
select get_v('用户输入的问题1');
使用“向量值1”搜索辅助参考表, 找到最相似的“向量2”(这一步就是向量检索, 可以用到向量索引), 取出与之相对应的“问题和答案”, (这一步可以设置阈值, 如果没有特别相似的就不要了.)
create or replace function get_faq(
v vector(1536), -- 用户抛出问题向量
th float, -- 相似度阈值
cnt int -- 返回多少条
)
returns table (
id int8, -- 辅助表ID
faq text, -- 辅助表问题+答案
similarity float -- 相似度
)
as $$
select
tbl_faq.id,
textcat('title: '||tbl_faq.f, ' --- '||tbl_faq.q) as faq,
1 - (tbl_faq.v <=> v) as similarity
from tbl_faq
where 1 - (tbl_faq.v <=> v) > th
order by similarity desc
limit cnt;
$$ language sql strict stable;
select t.id, t.faq, t.similarity
from get_faq(
(select get_v('用户输入的问题1')),
0.8, -- 相似度阈值
1 -- 返回最相似的1条
) as t;
将“用户输入的问题1 + 最相似问题和答案(如果有)”输入, 向openai提问, 从而修正直接向openai问“用户输入的问题1”的结果. 提升openai专业领域回答的准确度.
create or replace function ask_openai(
user_input text, -- 用户输入问题
faq text -- get_faq()得到的参考问题和答案
)
returns text as
$$
import openai
import os
openai.api_key = os.getenv("OPENAI_API_KEY")
search_string = user_input
docs_text = faq
messages = [{"role": "system", "content": "You concisely answer questions based on text provided to you."}]
prompt = """Answer the user's prompt or question:
{search_string}
by summarising the following text:
{docs_text}
Keep your answer direct and concise. Provide code snippets where applicable.
The question is about a Greenplum/PostgreSQL/PolarDB database. You can enrich the answer with other
Greenplum or PostgreSQ-relevant details if applicable.""".format(search_string=search_string, docs_text=docs_text)
messages.append({"role": "user", "content": prompt})
response = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=messages)
return response.choices[0]["message"]["content"]
$$ language plpython3u;
整合成一个函数:
(用户输入, openai返回基于辅助参考表修正后的答案.)
create or replace function good_ai_assistant(
user_input text -- 只需要用户输入
)
returns table (
content text
)
language sql stable
as $$
select ask_openai(user_input,
(select t.faq from get_faq( (select get_v('用户输入的问题1')), 0.8, 1 ) as t)
);
$$;
select content from good_ai_assistant('用户输入的问题');
思考
如果不是用openai?
由于openai的访问受限, 换一个基于开源自建的大模型或者使用国内大厂的大模型, 也可以使用同样的方法提升其他大模型在专业领域的回答问题精准度.
参考对应模型的api进行相应调整即可.
开源社区能干点啥?
开源社区的优势
- 人多, 每天都有问问题的, 回答问题的
- 问题和答案多, 但是需要提炼
利用大家的力量干什么?
- 一起提炼卡片知识点
如何奖励?
- 钱.
- 从哪里来? 大会(赞助)|流量(广告)|专家(服务)|内容(内容付费) ...
- 荣誉.
1、通过社区提炼卡片式知识点
2、卡片知识点管理方式: github | gitee
3、卡片知识点共享方式: github | gitee - csv - oss - duckdb_fdw - PostgreSQL | PolarDB
4、训练开源领域专业机器人(也许github可以直接对接openai, 将github和openai打通. github+ai, 可以想象=知识库+ai, 代码+ai).
ai应用
- gitee+ai
- 语雀知识库+ai
- 帮助文档+ai
- 钉钉聊天工具+ai
- 图片,音频搜索+ai
- ...
版权归原作者 库库的里昂 所有, 如有侵权,请联系我们删除。