一:最简 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)


1423

被折叠的 条评论
为什么被折叠?



