大模型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 小时前
海洋ALFA:主权与创新的交响,开启AI生态新纪元
人工智能
liliangcsdn1 小时前
LLM复杂数值的提取计算场景示例
人工智能·python
小和尚同志1 小时前
OpenCodeUI 让你随时随地 AI Coding
人工智能·aigc·ai编程
AI视觉网奇1 小时前
2d 数字人解决方案-待机动作
人工智能·计算机视觉
人工智能AI酱2 小时前
【AI深究】逻辑回归(Logistic Regression)全网最详细全流程详解与案例(附大量Python代码演示)| 数学原理、案例流程、代码演示及结果解读 | 决策边界、正则化、优缺点及工程建议
人工智能·python·算法·机器学习·ai·逻辑回归·正则化
爱喝可乐的老王2 小时前
机器学习监督学习模型--逻辑回归
人工智能·机器学习·逻辑回归
Ao0000002 小时前
机器学习——逻辑回归
人工智能·机器学习·逻辑回归
智算菩萨2 小时前
【How Far Are We From AGI】3 AGI的边界扩张——数字、物理与智能三重接口的技术实现与伦理困境
论文阅读·人工智能·深度学习·ai·agi
智算菩萨2 小时前
【How Far Are We From AGI】2 大模型的“灵魂“缺口:当感知、记忆与自我意识的迷雾尚未散去
人工智能·ai·agi·感知
deepxuan2 小时前
Day1--python三大库-Pandas
人工智能·python·pandas