大模型RAG项目实战-知识库问答助手v1版

安装 Ollama

根据官网指导,安装对应版本即可。

下载安装指导文档:

handy-ollama/docs/C1/1. Ollama 介绍.md at main · datawhalechina/handy-ollama

注意:在 Windows 下安装 Ollama 后,强烈建议通过配置环境变量来修改模型存储位置,不然就会默认存储在 C 盘目录下,而大模型文件一般都比较大。

知识库问答助手

架构图

RAG 知识库架构图如下:

知识库

知识库分块

功能:读取知识库文本文件,并将内容分割成多个段落块。

python 复制代码
# 1、读取文件内容
with open("knowledge/中医v1.txt", encoding="utf-8", mode="r") as fp:
    data = fp.read()

# 2、根据换行分割
chunk_list = data.split("\n\n")
chunk_list = [chunk for chunk in chunk_list if chunk]
print(chunk_list)

文本向量化

功能:将分块后的文本,通过调用文本向量模型,进行向量化。

python 复制代码
import requests

text = "感冒发烧"

res = requests.post(
    url="http://127.0.0.1:11434/api/embeddings",
    json={
        "model": "nomic-embed-text",
        "prompt": text
    },
)

embedding_list = res.json()['embedding']

print(text)
print(len(embedding_list), embedding_list)

向量数据库

功能:将文本向量化后,存储到向量数据库中,这里用 Chroma 向量数据库,支持通过语义相似度进行搜索。

python 复制代码
import uuid
import chromadb
import requests

def ollama_embedding_bye_api(text):
    res = requests.post(
        url="http://127.0.0.1:11434/api/embeddings",
        json={
            "model": "nomic-embed-text",
            "prompt": text
        },
    )

    embedding_list = res.json()['embedding']
    return embedding_list


client = chromadb.PersistentClient(path="db/chroma_demo")
collection = client.get_or_create_collection(name="collection_v1")

documents = ["风寒感冒", "寒邪客胃", "心脾两虚"]
ids = [str(uuid.uuid4()) for _ in documents]
embeddings = [ollama_embedding_bye_api(text) for text in documents]

# 插入数据
collection.add(
    ids=ids,
    documents=documents,
    embeddings=embeddings
)

# 关键字搜索
qs = "感冒胃疼"
qs_embedding = ollama_embedding_bye_api(qs)

res = collection.query(query_embeddings=[qs_embedding, ], query_texts=qs, n_results=2)
print(res)

推理模型

功能:调用 AI 大模型,实现文本生成功能

python 复制代码
import requests

prompt = "今天天气怎么样"

response = requests.post(
    url="http://127.0.0.1:11434/api/generate",
    json = {
        "model": "deepseek-r1:1.5b",
        "prompt": prompt,
        "stream": False
    }
)
res = response.json()['response']
print(res)

集成

完整代码:

python 复制代码
import uuid

import chromadb
import requests

def file_chunk_list():
    # 1、读取文件内容
    with open("knowledge/中医v1.txt", encoding="utf-8", mode="r") as fp:
        data = fp.read()

    # 2、根据换行分割
    chunk_list = data.split("\n\n")
    chunk_list = [chunk for chunk in chunk_list if chunk]
    return chunk_list

def ollama_embedding_bye_api(text):
    res = requests.post(
        url="http://127.0.0.1:11434/api/embeddings",
        json={
            "model": "nomic-embed-text",
            "prompt": text
        },
    )

    embedding_list = res.json()['embedding']
    return embedding_list

def ollama_generate_by_api(prompt):
    response = requests.post(
        url="http://127.0.0.1:11434/api/generate",
        json={
            "model": "deepseek-r1:1.5b",
            "prompt": prompt,
            "stream": False
        }
    )
    res = response.json()['response']
    return res

def initial():
    client = chromadb.PersistentClient(path="db/chroma_demo")

    # 创建集合
    # client.delete_collection("collection_v2")
    collection = client.get_or_create_collection(name="collection_v2")

    # 构造数据
    documents = file_chunk_list()
    ids = [str(uuid.uuid4()) for _ in range(len(documents))]
    embeddings = [ollama_embedding_bye_api(text) for text in documents]

    # 插入数据
    collection.add(
        ids=ids,
        documents=documents,
        embeddings=embeddings,
    )

def run():
    # 关键字搜索
    qs = "风寒感冒"
    qs_embedding = ollama_embedding_bye_api(qs)

    client = chromadb.PersistentClient(path="db/chroma_demo")
    collection = client.get_collection(name="collection_v2")
    res = collection.query(query_embeddings=[qs_embedding, ], query_texts=qs, n_results=2)
    result = res["documents"][0]
    context = "\n".join(result)
    print(context)
    prompt = f"""你是一个中医问答机器人,任务是根据参考信息回答用户问题,如果参考信息不足以回答用户问题,请回复不知道,不要去杜撰任何信息
    参考信息:{context},来回答问题:{qs},
    """
    result = ollama_generate_by_api(prompt)
    print(result)

if __name__ == "__main__":
    initial()
    run()

项目参考:

【大模型RAG完整教程】手把手带你结合项目实战,完成一套完整的RAG项目!增加检索/文本向量/知识库搭建_哔哩哔哩_bilibili

相关推荐
【建模先锋】1 分钟前
一区直接写!CEEMDAN分解 + Informer-LSTM +XGBoost组合预测模型
人工智能·lstm·ceemdan·预测模型·风速预测·时间序列预测模型
fsnine5 分钟前
YOLOv2原理介绍
人工智能·计算机视觉·目标跟踪
蛋先生DX26 分钟前
RAG 切片利器 LumberChunker 是如何智能地把文档切割成 LLM 爱吃的块
llm·aigc·ai编程
爱和冰阔落26 分钟前
【C++多态】虚函数/虚表机制与协变 、override和final关键字全解析
开发语言·c++·面试·腾讯云ai代码助手
土丁爱吃大米饭26 分钟前
AIGC工具助力2D游戏美术全流程
aigc·小游戏·游戏开发·ai助力
倔强的石头10633 分钟前
AI修图革命:IOPaint+cpolar让废片拯救触手可及
人工智能·cpolar·iopaint
文火冰糖的硅基工坊37 分钟前
[人工智能-大模型-15]:大模型典型产品对比 - 数字人
人工智能·大模型·大语言模型
JJJJ_iii41 分钟前
【机器学习05】神经网络、模型表示、前向传播、TensorFlow实现
人工智能·pytorch·python·深度学习·神经网络·机器学习·tensorflow
William.csj44 分钟前
服务器/Pytorch——对于只调用一次的函数初始化,放在for训练外面和里面的差异
人工智能·pytorch·python
魔术师卡颂1 小时前
不就写提示词?提示词工程为啥是工程?
前端·人工智能·后端