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

news/2024/7/9 20:00:51 标签: 人工智能, 机器人, postgresql, 数据库

目录

背景

基本步骤讲解

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

http://www.niftyadmin.cn/n/5090499.html

相关文章

js中父子元素如何传值

在JavaScript中&#xff0c;父子元素之间可以通过以下方式传递值&#xff1a; Props&#xff08;属性传递&#xff09;&#xff1a;父组件通过属性传递给子组件&#xff0c;子组件可以通过props接收父组件传递的值。 父组件传递值&#xff1a; <ChildComponent propValue…

Android 音频可视化

Android音频可视化&#xff0c;指的是将音频的频率绘制到屏幕上&#xff0c;达到一种视觉效果&#xff0c;使播放或录制过程更加生动形象。 在Android进行视频可视化涉及的三个主要知识点,其中比较难以理解的傅里叶变换公式。 Android原生的Visualizer使用&#xff08;获取频…

NewStarCTF2023week2-include 0。0

简单审一下代码&#xff1a; 1、flag在flag.php 2、使用get请求方式给file传参 3、存在正则匹配&#xff0c;会过滤掉base和rot&#xff08;i表示不区分大小写&#xff0c;也就是我们无法使用大小写绕过&#xff09; 正则匹配详细知识请参考我之前的博客 http://t.csdnimg.…

AI智能助理系统在线提问系统 轻松解答,快速解决问题

今天给大家分享一款AI智能助理系统在线提问系统&#xff0c;也就是人工智能对话系统&#xff0c;&#xff0c;它可以陪你聊天&#xff0c;帮你写文章&#xff0c;帮你写论文&#xff0c;帮你写代码&#xff0c;帮你写小说&#xff0c;帮你创意策划&#xff0c;帮你做Excel表格&…

前端成神之路-HTML

前端成神之路-HTML 目录 前端成神之路-HTML 认识网页 常见浏览器介绍 查看浏览器占有的市场份额&#xff08;知晓&#xff09; 浏览器内核&#xff08;理解&#xff09; Web标准&#xff08;重点&#xff09; Web 标准的好处 Web 标准构成 HTML 初识 HTML骨架格式 …

1.MySQL库的操作

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 1.创建数据库&#xff1a; 语法&#xff1a;create database if not exists db_name charset字符集 collate校验规则 ; if not exists &#xff0c;charset &#xff0c;collate可以不加&#xff0c;直接create database 数…

Spring源码解析——@Transactional注解的声明式事物介绍

正文 面的几个章节已经分析了spring基于AspectJ的源码&#xff0c;那么接下来我们分析一下Aop的另一个重要功能&#xff0c;事物管理。最全面的Java面试网站 事务的介绍 1.数据库事物特性 原子性 多个数据库操作是不可分割的&#xff0c;只有所有的操作都执行成功&#xff…

C++学习——string 详解(即C++字符串详解)

以下内容源于C语言中文网的学习与整理&#xff0c;非原创&#xff0c;如有侵权请告知删除。 一、定义string变量的方法 C增强了对字符串的支持&#xff0c;除了可以使用C风格的字符串&#xff0c;还可以使用内置的 string 类。 string是类&#xff0c;而不是基本数据类型。虽…