前沿|AIGC起飞!通过数据库为AI大模型注入“持久记忆”


prtyaa
prtyaa 2024-01-12 14:17:51 50475 赞同 0 反对 0
分类: 资源 标签: 国产数据库
前沿|AIGC起飞!通过数据库为AI大模型注入“持久记忆”
AIGC迅猛发展的时代,是否能拥有大规模的存储查询非结构化数据的能力,是对于AI应用的一个关键挑战。对于这种数据,当下常见的解决方案是向量数据库。向量数据库配合大语言模型LLM使用,可以帮助企业构建私域数据的专属知识库,辅助大模型生成更准确的知识库答案。
图片
本文会从什么是非结构化数据出发,用PostgreSQL的插件pgvector作为案例来讲述如何使用和查询它们。
非结构化数据通常指没有预定义结构的数据,如图片,视频,文本等。
 
想要更好对这些数据进行存储和查询,通常需要先通过Embeddings(嵌入向量)的方式,将它们转化为向量的等结构化数据后再进一步处理。转换后的向量表示可以帮助我们提取它们的特征,对比它们之间的相似度。(openAI的embeddings API效果很好,但在实际使用中如果我们更希望构建私域数据,huggingface上的text2vec和m3e系列嵌入模型也是非常不错的选择。)
Embeddings的这种相似度的比较能捕捉到这些非结构化数据之间的相似度,并且应用于搜索、推荐、分类、聚类等算法中。
这里借助一个Supabase文本嵌入的例子来解释文本中的相似度,假设我们有三个短语:
1.猫追老鼠
2.小猫捉啮齿动物
3.我喜欢火腿三明治
如果让人来分类,可以很明显的看出短语1和2十分相近,而短语3和其他两条完全无关。人类在分辨事物的时候,可以通过识别不同事物间的特征来判断种类。而对于语言来说,也可以通过判断语言的特征(意义)知道每个单字、词语的含义,进而理解整句话的意思。
这些语言信息会被embedding算法提取成向量形式的特征信息(比如一串浮点数),存储在向量数据库中。之后就可以通过数学上的向量计算出距离(余弦距离,欧氏距离等),来得出不同条目之间的相似度。而借助相似度就能更好的辅助大语言模型LLM进行知识查找,借用LangChain-Chatchat(原langchain-chatGLM)的一张原理图:

图片

图中1-4步是一些预处理步骤,我们刚才讨论的就是这个过程中的第5步——“Embedding”和第6步——“存入向量数据库”。在存入向量数据库中后,系统每次收到用户的Prompt(请求)就会先从向量数据库进行背景知识搜索,然后将问题和查获的信息一起给到大语言模型LLM中进行回答解析。
对于知识专业性较强且信息更新较快的一般企业来说,这种方式远比直接训练大模型或是微调模型更加便捷高效。外挂知识库的方式也让整个架构更加灵活,后续效果合适也可以自己将LLM部分替换成更合适的模型。
回看到过程中可选的向量数据库
 
现在市面上的向量数据库各有千秋,常见的向量数据库有Milvus, Pinecone,Chroma,FAISS等。而pgvector作为PostgreSQL的插件也可以满足向量的存储和和查询等功能。如果项目本身已经使用PG或者PG生态的产品如Neon,Supabase等,又不想引入新的数据库增加系统复杂度,pgvector是个不错的选择。通过与 PostgreSQL的集成,pgvector也继承了相同级别的稳健性和安全性功能,使用户能够安全的存储和管理其矢量数据。
用pgvector实现文本相似度检测其实相当简单
 
安 装
这里还是推荐用源码编译的方式安装,如果想省去配置的麻烦也可以用Docker
等其他方式
cd /tmp
git clone --branch v0.4.4 https://github.com/pgvector/pgvector.git
cd pgvector
make
make install # may need sudo
启用扩展
CREATE EXTENSION vector;
之后在数据库端的准备就ok了,启动psql服务后开始进行python这边的编写
引入embedding模型
测试默认使用cpu,实际使用可以切换成gpu
from langchain.embeddings import HuggingFaceEmbeddings

embeddings = HuggingFaceEmbeddings(model_name='moka-ai/m3e-base',
model_kwargs={'device': 'cpu'})
配置pgvector所需的基本参数
import os
from langchain.vectorstores.pgvector import PGVector

PGVECTOR_CONNECTION_STRING = PGVector.connection_string_from_db_params(
driver=os.environ.get("PGVECTOR_DRIVER", "psycopg2"),
host=os.environ.get("PGVECTOR_HOST", "localhost"),
port=int(os.environ.get("PGVECTOR_PORT", "5432")),
database=os.environ.get("PGVECTOR_DATABASE", "postgres"),
user=os.environ.get("PGVECTOR_USER", "postgres"),
password=os.environ.get("PGVECTOR_PASSWORD", "123456"),
)
数据准备和注入
这里所应用的就是上文中猫捉老鼠短语的例子,其中data是实际需要对比的文本数据,metadatas按照顺序和data一一对应,可以理解为data的解释元数据
from langchain.vectorstores.pgvector import DistanceStrategy

data = [
"猫追老鼠",
"小猫捉啮齿动物",
"我喜欢火腿三明治",
"你使用的是什么embedding算法"
]
metadatas = [
{"answer":"老鼠可能被抓到"},
{"answer":"啮齿动物被抓到"},
{"answer":"火腿和三明治是不错的搭配"},
{"answer":"我使用的是m3e-base作为embedding算法,对中文的支持更好"}
]

PGVector.from_texts(texts = data,
embedding=embeddings,
collection_name="custom_qa",
connection_string=PGVECTOR_CONNECTION_STRING,
metadatas=metadatas
)
文本相似度搜索
from langchain.docstore.document import Document

query = "猫捉老鼠"
print("="*80)
docs_with_score: list[tuple[Document, float]] =     store.similarity_search_with_score(query)
for doc, score in docs_with_score:
print("Score:", score)
print(doc.page_content)
print(doc.metadata)
print("-"*80)
结果一览
分数越低相似度越高,可以明显看到“猫追老鼠”和“猫捉老鼠”的相似度非常高,近乎一致,而和“小猫捉啮齿动物”仅是相对相近,和其他另外两条近距离就非常远了。
=================================================================
Score: 0.04342155086519628
猫追老鼠
{'answer': '老鼠可能被抓到'}
-----------------------------------------------------------------
Score: 0.12241556104896034
小猫捉啮齿动物
{'answer': '啮齿动物被抓到'}
-----------------------------------------------------------------
Score: 0.33161097392725436
我喜欢火腿三明治
{'answer': '火腿和三明治是不错的搭配'}
-----------------------------------------------------------------
Score: 0.3587415090526611
你使用的是什么embedding算法
{'answer': '我使用的是m3e-base作为embedding算法,对中文的支持更好'}
-----------------------------------------------------------------
在实际使用中从向量数据库中搜索到的结果会被选出前几条,一起放到LLM中按照相关性分配权重进行归纳总结。
 
小 结
目前向量数据库赛道正处于蓬勃发展的阶段,几大向量数据库都在AI的繁荣生态下快速发展。而背靠PostgreSQL的向量数据库插件生态也在不断积极扩展,除了pgvector之外,也有其他,诸如:注重速度的pg_embedding、使用Rust编写的pgvecto.rs等插件争相竞艳。这些大都被langchain支持,可以较好地直接应用到私有化知识库的大模型LLM为企业助力。

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
prtyaaL2
粉丝 1 资源 1949 + 关注 私信
最近热门资源
银河麒麟桌面操作系统备份用户数据  129
统信桌面专业版【全盘安装UOS系统】介绍  128
银河麒麟桌面操作系统安装佳能打印机驱动方法  119
银河麒麟桌面操作系统 V10-SP1用户密码修改  108
麒麟系统连接打印机常见问题及解决方法  22
最近下载排行榜
银河麒麟桌面操作系统备份用户数据 0
统信桌面专业版【全盘安装UOS系统】介绍 0
银河麒麟桌面操作系统安装佳能打印机驱动方法 0
银河麒麟桌面操作系统 V10-SP1用户密码修改 0
麒麟系统连接打印机常见问题及解决方法 0
作者收入月榜
1

prtyaa 收益393.62元

2

zlj141319 收益218元

3

1843880570 收益214.2元

4

IT-feng 收益210.13元

5

风晓 收益208.24元

6

777 收益172.71元

7

Fhawking 收益106.6元

8

信创来了 收益105.84元

9

克里斯蒂亚诺诺 收益91.08元

10

技术-小陈 收益79.5元

请使用微信扫码

加入交流群

请使用微信扫一扫!