用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 实现 STDIO和SSE MCP Server的过程详解

《SpringAI实现STDIO和SSEMCPServer的过程详解》STDIO方式是基于进程间通信,MCPClient和MCPServer运行在同一主机,主要用于本地集成、命令行工具等场景... 目录Spring AI 实现 STDIO和SSE MCP Server1.新建Spring Boot项目2.a

一文详解PostgreSQL复制参数

《一文详解PostgreSQL复制参数》PostgreSQL作为一款功能强大的开源关系型数据库,其复制功能对于构建高可用性系统至关重要,本文给大家详细介绍了PostgreSQL的复制参数,需要的朋友可... 目录一、复制参数基础概念二、核心复制参数深度解析1. max_wal_seChina编程nders:WAL

PostgreSQL 序列(Sequence) 与 Oracle 序列对比差异分析

《PostgreSQL序列(Sequence)与Oracle序列对比差异分析》PostgreSQL和Oracle都提供了序列(Sequence)功能,但在实现细节和使用方式上存在一些重要差异,... 目录PostgreSQL 序列(Sequence) 与 oracle 序列对比一 基本语法对比1.1 创建序

最详细安装 PostgreSQL方法及常见问题解决

《最详细安装PostgreSQL方法及常见问题解决》:本文主要介绍最详细安装PostgreSQL方法及常见问题解决,介绍了在Windows系统上安装PostgreSQL及Linux系统上安装Po... 目录一、在 Windows 系统上安装 PostgreSQL1. 下载 PostgreSQL 安装包2.

Win11安装PostgreSQL数据库的两种方式详细步骤

《Win11安装PostgreSQL数据库的两种方式详细步骤》PostgreSQL是备受业界青睐的关系型数据库,尤其是在地理空间和移动领域,:本文主要介绍Win11安装PostgreSQL数据库的... 目录一、exe文件安装 (推荐)下载安装包1. 选择操作系统2. 跳转到EDB(PostgreSQL 的

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Spring AI ectorStore的使用流程

《SpringAIectorStore的使用流程》SpringAI中的VectorStore是一种用于存储和检索高维向量数据的数据库或存储解决方案,它在AI应用中发挥着至关重要的作用,本文给大家介... 目录一、VectorStore的基本概念二、VectorStore的核心接口三、VectorStore的

Spring AI集成DeepSeek三步搞定Java智能应用的详细过程

《SpringAI集成DeepSeek三步搞定Java智能应用的详细过程》本文介绍了如何使用SpringAI集成DeepSeek,一个国内顶尖的多模态大模型,SpringAI提供了一套统一的接口,简... 目录DeepSeek 介绍Spring AI 是什么?Spring AI 的主要功能包括1、环境准备2

Spring AI集成DeepSeek实现流式输出的操作方法

《SpringAI集成DeepSeek实现流式输出的操作方法》本文介绍了如何在SpringBoot中使用Sse(Server-SentEvents)技术实现流式输出,后端使用SpringMVC中的S... 目录一、后端代码二、前端代码三、运行项目小天有话说题外话参考资料前面一篇文章我们实现了《Spring