暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

瀚高数据库 2023-08-23
1157


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为企业助力
供稿 |郭hc
审核|Gavin LYU

参考文献:
[1] LangChain-Chatchat仓库:https://github.com/chatchat-space/Langchain-Chatchat
[2] pgvector仓库:https://github.com/pgvector/pgvector
[3] Storing OpenAI embeddings in Postgres with pgvector:
https://supabase.com/blog/openai-embeddings-postgres-vector 
[4] ChatGPT 点燃的向量数据库们 https://zhuanlan.zhihu.com/p/627729595 
[5]Langchain PGVector 补充智能客服匹配式问答
https://blog.csdn.net/q116975174/article/details/131038366 




文章转载自瀚高数据库,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论