用PolarDB|PostgreSQL提升通用ai机器人在专业领域的精准度

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: chatgpt这类通用机器人在专业领域的回答可能不是那么精准, 原因有可能是通用机器人在专业领域的语料库学习有限, 或者是没有经过专业领域的正反馈训练.为了提升通用机器人在专业领域的回答精准度, 可以输入更多专业领域相似内容作为prompt来提升通用ai机器人在专业领域的精准度.PolarDB | PostgreSQL 开源数据库在与openai结合的过程中起到的核心作用是: 基于向量插件的向量类型、向量索引、向量相似搜索操作符, 加速相似内容的搜索. 通过“问题和正确答案”作为参考输入, 修正openapi在专业领域的回答精准度.

作者

digoal

日期

2023-07-26

标签

PostgreSQL , PolarDB , openAI , 向量 , 知识库 , prompt , 相似内容 , 提示 , chatgpt , 通用机器人


背景

chatgpt这类通用机器人在专业领域的回答可能不是那么精准, 原因有可能是通用机器人在专业领域的语料库学习有限, 或者是没有经过专业领域的正反馈训练.

为了提升通用机器人在专业领域的回答精准度, 可以输入更多专业领域相似内容作为prompt来提升通用ai机器人在专业领域的精准度.

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”,
  • 使用“向量值1”搜索辅助参考表, 找到最相似的“向量2”(这一步就是向量检索, 可以用到向量索引), 取出与之相对应的“问题和答案”, (这一步可以设置阈值, 如果没有特别相似的就不要了.)
  • 将“用户输入的问题1 + 最相似问题和答案(如果有)”输入, 向openai提问, 从而修正直接向openai问“用户输入的问题1”的结果. 提升openai专业领域回答的准确度.

Demo 演示

1、通过云起实验启动数据库, 这个实验室是永久免费的.

参考:

创建并启动容器

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
  • ...

参考

https://mp.weixin.qq.com/s/TEEdmOXvS5Wm2ajsJ7ejOg

https://tanzu.vmware.com/content/webinars/jul-11-building-ai-powered-search-applications-on-vmware-greenplum-data-warehouse-with-pgvector

https://www.brighttalk.com/webcast/14883/586427

https://supabase.com/blog/openai-embeddings-postgres-vector

https://help.openai.com/en/articles/4936848-how-do-i-create-a-good-prompt

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
13天前
|
关系型数据库 分布式数据库 数据库
开源云原生数据库PolarDB PostgreSQL 15兼容版本正式发布
PolarDB进行了深度的内核优化,从而实现以更低的成本提供商业数据库的性能。
|
24天前
|
Cloud Native 关系型数据库 分布式数据库
云原生数据库2.0问题之PolarDB利用云计算技术红利如何解决
云原生数据库2.0问题之PolarDB利用云计算技术红利如何解决
|
26天前
|
Cloud Native 关系型数据库 分布式数据库
云原生关系型数据库PolarDB问题之PolarDB相比传统商用数据库的优势如何解决
云原生关系型数据库PolarDB问题之PolarDB相比传统商用数据库的优势如何解决
28 1
|
30天前
|
存储 关系型数据库 MySQL
再探PolarDB —— PolarDB MySQL 四大场景下的全方位评测
本文全面评测了阿里云PolarDB MySQL在四大关键场景下的表现:Serverless极致弹性、列存索引(IMCI)、弹性并行查询(ePQ)以及无感秒切高可用。通过官方提供的免费体验资源,我们深入了解了PolarDB MySQL的核心能力和性能。Serverless极致弹性列存索引(IMCI弹性并行查询(ePQ)无感秒切高可用此外,文章还介绍了PolarDB MySQL在数据备份和HTAP(混合事务/分析处理)场景下的优势,包括灵活的备份策略、高效的全量和库表恢复方式,以及通过IMCI支持的HTAP能力。这些特性共同构成了PolarDB MySQL作为一款先进的云数据库服务的强大竞争力。
|
1月前
|
存储 关系型数据库 分布式数据库
揭秘PolarDB:中国云原生数据库的超级英雄,如何颠覆传统数据存储?
【8月更文挑战第8天】在数字化时代,数据成为企业的核心资产。随着云技术的发展,企业纷纷向云端迁移,选择合适的云原生数据库至关重要。PolarDB凭借卓越性能、高可靠性和易用性在中国市场领先。它采用存储计算分离架构,支持独立扩展,提高处理大规模数据的效率和灵活性。多副本机制确保数据高可用性和持久性,优于单副本存储方案。兼容多种数据库引擎,提供丰富管理工具,降低迁移和维护成本。按量付费模式帮助企业有效控制成本。因此,PolarDB为企业数字化转型提供了强有力的支持。
77 1
|
21天前
|
存储 人工智能 关系型数据库
PolarDB 与 AI/ML 集成的应用案例
【8月更文第27天】随着大数据和人工智能技术的发展,越来越多的企业开始探索将关系型数据库与 AI/ML 技术相结合的方式,以提高数据分析效率和业务智能化水平。阿里云的 PolarDB 是一款高性能的关系型数据库服务,支持多种数据库引擎,如 MySQL、PostgreSQL 和 Oracle。通过与阿里云的其他 AI/ML 服务集成,PolarDB 能够为企业提供端到端的数据处理和分析解决方案。
56 0
|
2月前
|
关系型数据库 分布式数据库 数据库
PolarDB产品使用问题之如何进行PostgreSQL(简称PG)的全量和增量备份管理
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
2月前
|
运维 关系型数据库 MySQL
PolarDB产品使用问题之PolarDB MySQL版和PolarDB-X的区别是什么
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
29天前
|
人工智能 自然语言处理 安全
盘点国内:AI写作助手_ai智能问答机器人
AI写作助手是利用人工智能技术,特别是自然语言处理(NLP)技术,来辅助用户进行写作的工具。这类助手通过分析大量文本数据,能够理解语言的结构和含义,从而生成、编辑或优化文本内容。AI写作助手通常具有自动纠错、语法检查、内容生成和风格调整等功能,帮助用户提高写作效率和质量。
|
2月前
|
人工智能 关系型数据库 MySQL
探索和体验云原生数据库PolarDB MySQL版在AI场景中的应用
探索和体验云原生数据库PolarDB MySQL版在AI场景中的应用
151 0

相关产品

  • 云原生数据库 PolarDB