10.最简 RAG 雏形完成

一:最简 RAG 雏形核心认知

1.1 一句话讲透:最简 RAG 雏形到底是什么?

最简 RAG 雏形,就是去掉所有复杂的工程化封装、冗余代码,只保留 RAG 最核心的 7 步逻辑,用最少的代码,实现「用户提问→基于你的
PDF 知识库→大模型生成精准回答」的完整闭环。你可以把它理解成「RAG 的 Hello World」,所有复杂的企业级 RAG系统,都是在这个最简雏形的基础上扩展来的。

1.2 最简 RAG 雏形的 7 步核心闭环(你必须背下来,面试直接用)

1.  加载你之前做好的「向量库」和「元数据」(就是生成的.faiss文件和.json文件)
2.  接收用户的问题(比如「Day87的学习内容是什么?」)
3.  给用户的问题,生成对应的「语义向量」(和你之前给文本块生成向量用的是同一个模型)
4.  拿着问题的向量,去向量库里找和它最像的前3个文本块(相似度检索)
5.  把找到的3个文本块,加上「大模型必须严格遵守的规则」,再加上用户的问题,拼接成给大模型的提示词(Prompt)
6.  把拼接好的提示词,传给通义千问大模型,让大模型生成回答
7.  把大模型生成的回答,返回给用户

二:最简 RAG 雏形全流程实操

# ====================== 最简RAG雏形:一键运行完整代码 ======================
import faiss
import numpy as np
import json
import dashscope
from dashscope import TextEmbedding, Generation

# ====================== 核心配置区(只改这里) ======================
dashscope.api_key = "替换成你自己的通义千问API-KEY"
INDEX_PATH = r"F:\RAG-Learning-Project\data\向量库\rag_vector_index.faiss"
META_DATA_PATH = r"F:\RAG-Learning-Project\data\向量库\rag_meta_data.json"
TOP_K = 3

# ====================== 全局加载向量库和元数据(只加载一次) ======================
index = faiss.read_index(INDEX_PATH)
with open(META_DATA_PATH, "r", encoding="utf-8") as f:
    meta_data = json.load(f)
print(f"知识库加载完成,RAG系统准备就绪!")

# ====================== 核心函数:一键RAG问答 ======================
def rag_ask(question: str) -> str:
    """
    输入用户的问题,直接返回大模型的回答,一键完成所有RAG流程
    """
    # 1. 生成问题向量
    emb_response = TextEmbedding.call(
        model=TextEmbedding.Models.text_embedding_v2,
        input=question
    )
    question_embedding = np.array(emb_response.output["embeddings"][0]["embedding"], dtype=np.float32).reshape(1, -1)
    
    # 2. 相似度检索
    distances, indices = index.search(question_embedding, TOP_K)
    result_indices = indices[0].tolist()
    
    # 3. 提取相关内容
    related_content = []
    for block_id in result_indices:
        for meta in meta_data:
            if meta["index_id"] == block_id:
                related_content.append(meta["chunk_content"])
                break
    
    # 4. 拼接Prompt
    prompt = f"""你是一个知识库问答助手,必须严格遵守以下规则:
1.  你只能用下面提供的【参考内容】回答用户的问题,绝对不能编造内容
2.  如果参考内容里没有相关信息,你要直接说「抱歉,我在知识库中没有找到相关内容」
3.  回答要简洁、精准,完全基于参考内容,不要添加无关内容

【参考内容】
"""
    for content in related_content:
        prompt += f"\n{content}\n"
    prompt += f"\n【用户的问题】\n{question}"
    
    # 5. 调用大模型生成回答
    llm_response = Generation.call(
        model=Generation.Models.qwen_turbo,
        prompt=prompt,
        temperature=0.1
    )
    return llm_response.output.text

# ====================== 程序入口:一键提问 ======================
if __name__ == "__main__":
    # 替换成你要问的问题,直接调用rag_ask函数,就能得到回答
    USER_QUESTION = "Day87的学习内容是什么?"
    answer = rag_ask(USER_QUESTION)
    print("\n【RAG问答结果】")
    print(answer)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HappyAcmen

非常感谢大佬的鼓励!感谢感谢!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值