简单编码方式构建大模型知识库

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值