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

本文主要是介绍用PolarDB|PostgreSQL提升通用ai机器人在专业领域的精准度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

背景

基本步骤讲解

Demo 演示

思考

如果不是用openai?

开源社区能干点啥?

ai应用


收录专栏: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开源数据库 - 云起实验室-在线实验-上云实践-阿里云开发者社区-阿里云官方实验平台-阿里云

参考:

  • https://github.com/digoal/blog/blob/master/202307/20230710_03.md

创建并启动容器

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

这篇关于用PolarDB|PostgreSQL提升通用ai机器人在专业领域的精准度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/213849

相关文章

Spring AI使用tool Calling和MCP的示例详解

《SpringAI使用toolCalling和MCP的示例详解》SpringAI1.0.0.M6引入ToolCalling与MCP协议,提升AI与工具交互的扩展性与标准化,支持信息检索、行动执行等... 目录深入探索 Spring AI聊天接口示例Function CallingMCPSTDIOSSE结束语

postgresql使用UUID函数的方法

《postgresql使用UUID函数的方法》本文给大家介绍postgresql使用UUID函数的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录PostgreSQL有两种生成uuid的方法。可以先通过sql查看是否已安装扩展函数,和可以安装的扩展函数

三频BE12000国补到手2549元! ROG 魔盒Pro WIFI7电竞AI路由器上架

《三频BE12000国补到手2549元!ROG魔盒ProWIFI7电竞AI路由器上架》近日,华硕带来了ROG魔盒ProWIFI7电竞AI路由器(ROGSTRIXGR7Pro),目前新... 华硕推出了ROG 魔盒Pro WIFI7电竞AI路由器(ROG STRIX GR7 Phttp://www.cppcn

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

PowerShell中15个提升运维效率关键命令实战指南

《PowerShell中15个提升运维效率关键命令实战指南》作为网络安全专业人员的必备技能,PowerShell在系统管理、日志分析、威胁检测和自动化响应方面展现出强大能力,下面我们就来看看15个提升... 目录一、PowerShell在网络安全中的战略价值二、网络安全关键场景命令实战1. 系统安全基线核查

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

postgresql数据库基本操作及命令详解

《postgresql数据库基本操作及命令详解》本文介绍了PostgreSQL数据库的基础操作,包括连接、创建、查看数据库,表的增删改查、索引管理、备份恢复及退出命令,适用于数据库管理和开发实践,感兴... 目录1. 连接 PostgreSQL 数据库2. 创建数据库3. 查看当前数据库4. 查看所有数据库

PostgreSQL数据库密码被遗忘时的操作步骤

《PostgreSQL数据库密码被遗忘时的操作步骤》密码遗忘是常见的用户问题,因此提供一种安全的遗忘密码找回机制是十分必要的,:本文主要介绍PostgreSQL数据库密码被遗忘时的操作步骤的相关资... 目录前言一、背景知识二、Windows环境下的解决步骤1. 找到PostgreSQL安装目录2. 修改p