简单编码方式构建大模型知识库
1、概要
目前主要有两种方式一种用开源框架如dify,fastgpt等,或者过编码的方式如langchain这样在某些业务下会更加灵活。本文只用到http相互调用来构建知识库。只需要简单的python基础。
2、构建组件
知识库构建需要一个大模型这里选用ollama可以选用qwen2模型,其次我们需要知识的检索跟知识的排序,部署xinference平台。部署ranke跟enbeding模型。rerank是用来排序的,enbeding是用来把知识转化成向量的(如何部署xinference跟ollama可以看我之前的文章)
3、实现流程
知识片段保存成向量,使用bge-large-zh-v1.5模型把输出的中文转成向量
curl http://0.0.0.0:9997/v1/embeddings \
-H "Content-Type: application/json" \
-d '{
"input": ["手机","苹果","耳机","宇宙","地球"],
"model": "bge-large-zh-v1.5"
}'
输出结果会是以下格式
embedding就是向量,转成向量后的数据可以保存到数据库中,通过编码的方式如faiss来进行向量查询来比对最相似的,如下代码就是通过模拟一组数据然后通过向量进行查询
import faiss
import numpy as np
import requests
# 文字转向量
def embedding(data):
url = "http://10.10.40.102:19997/v1/embeddings"
headers = {
"Content-Type": "application/json"
}
data = {
"input": data,
"model": "bge-large-zh-v1.5"
}
response = requests.post(url, headers=headers, json=data)
vectorData = [item['embedding'] for item in response.json()['data']]
return vectorData
def get_result():
rawData = ["苹果","香蕉","白菜","宇宙"]
# 文字转向量
vectorData = embedding(rawData)
# 将嵌入向量转换为 NumPy 数组
embeddings_np = np.array(vectorData).astype('float32')
dimension = embeddings_np.shape[1] # 向量的维度
index = faiss.IndexFlatL2(dimension)
index.add(embeddings_np)
# 查询结果
query_vector=embedding(["水果"])[0]
# 进行搜索
k = 5 # 返回最相似的 5 个向量
distances, indices = index.search(np.array([query_vector]), k)
# 打印结果
for i, (dist, idx) in enumerate(zip(distances[0], indices[0])):
distance_threshold = 1
if idx != -1 and dist < distance_threshold: # 忽略无效索引
print(f"Index: {idx} " + rawData[idx])
print(f"Distance: {dist}")
else:
break
通过http调用xinference的rerank模型,输出的内容会进行重新排序根据语意最相似的排在最前面
curl -X 'POST' 'http://0.0.0.0:9997/v1/rerank' \
-H 'Content-Type: application/json' \
-d '{
"model": "bge-reranker-large",
"query": "水果",
"documents": ["手机","苹果","耳机","宇宙","地球"]
}'
返回结果
{"id":"48f0e1ec-f0fd-11ee-be64-0242ac110004","results":[{"index":0,"relevance_score":0.9999258518218994,"document":null},{"index":1,"relevance_score":0.04828396067023277,"document":null},{"index":2,"relevance_score":0.00007636439841007814,"document":null},{"index":4,"relevance_score":0.00007636331429239362,"document":null},{"index":3,"relevance_score":0.00007617334631504491,"document":null}]}
3、具体实现架构图
图中的流程几乎都在调用http,只是做简单的逻辑梳理就能通过编码的方式来构建了知识库,在此基础上我们可以更加深入的进行业务调整。这里还有部分细节需要注意如bge-reranker-large最大1024也就是说你拆分文档文字不能超过512。超过向量通过embeddings 匹配就会出现偏差
4、通过向量数据库
上面我们是通过faiss这个库对向量进行比对,这种方式在存储向量检索不是很方便,我们可以把转换后的数据存储到向量数据库ChromaDB中直接通过检索获取数据。
部署ChromaDB
docker run -d -p 8000:8000 --name chroma-container chromadb/chroma:latest
作者:星哥来了