大模型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

相关推荐
只是没名字11 小时前
Codex CLI Windows 新手安装教程:从 Node.js 到首次运行
人工智能
用户86306526961311 小时前
Krea 2 LoRA 训练全流程踩坑记录:从打标到双卡并行的 Windows 原生实战
人工智能
木雷坞13 小时前
让 AI 编程助手跑得起项目:Dev Container 实践记录
人工智能
leeyi14 小时前
MCP 工具集成:外部工具变 Eino Tool
aigc·agent·mcp
腾讯云开发者14 小时前
港科大郭毅可谈Agentic AI时代的核心命题:人机共生,人不可能退场
人工智能
常丛丛14 小时前
5.6 LangGraph-Edges理解-Agent图的道路系统
人工智能
雪隐15 小时前
个人电脑玩AI-08让5060 Ti给你打工——我拿 Unlimited-OCR扫了 600 页书,然后悟了
人工智能·后端
Coffeeee15 小时前
Prompt要花心思写,与 AI 对话的七个技巧
人工智能·aigc·ai编程
刘棕霆15 小时前
27—AI Skill 测评如何避免确认偏误:盲测对比与解盲分析
aigc·ai编程·测试
烬羽15 小时前
字符串算法入门:从反转字符串到回文判断,面试不再慌
算法·面试