菜鸟AI - 让提示词生成更简单! 全站导航 全站导航
AI工具安装 新手教程 进阶教程 辅助资源 AI提示词 热点资讯 技术资讯 产业资讯 内容生成 模型技术 AI信息库

已有账号?

首页 > AI教程 > RAG入门案例教程:快速掌握检索增强生成原理
进阶教程

RAG入门案例教程:快速掌握检索增强生成原理

2026-05-31
阅读 0
热度 0
作者 菜鸟AI编辑部
摘要

摘要

RAG将大模型与外部知识库结合,实现开卷考试式应答。通过Python和LangChain框架,将产品手册

深入理解RAG:从概念到实战

设想一个场景:你需要搭建一个客服系统,实时解答用户关于产品的各类问题。你会如何设计?

最直观的方案是雇佣专职客服——但人力成本(薪资+社保)对于中小企业而言并不友好。换个思路:编写一个脚本程序实现自动回复?可惜脚本只能处理预设的if-else分支,用户一旦提出稍显灵活的问题,逻辑瞬间失效。

这时,你自然会想到大语言模型(LLM)。没错,LLM确实能提供接近真人对话的交互感,但致命短板在于:它对你的产品信息、使用手册、注意事项等特定领域知识一无所知。

如何让大模型基于自有知识库进行精准应答?答案就是检索增强生成(RAG)。RAG的核心架构可以概括为:一个具备推理能力的模型大脑,搭配一个可实时查阅的外部知识库。把大模型想象成一个备考学生,其预训练知识相当于已学内容,而你需要它掌握的专有信息则属于超纲部分。解决方案很简单:直接给它一本“开卷考试”的参考书——外部知识库。

技术栈与环境准备

编程语言选用Python,核心框架则锁定LangChain。LangChain作为大模型应用开发领域的热门框架,其核心价值在于无缝整合各类模型、工具与数据源,让原本只会对话的模型真正蜕变为能够调取数据、执行程序的智能体。

1. 模型调用封装

LangChain提供了一套标准化的模型调用API,你无需逐个查阅不同模型厂商的接口文档、手动组装HTTP请求并反复调试。看一个实际例子:

pythonllm = ChatOpenAI(model="deepseek-chat",temperature=0.7,api_key=os.getenv("DEEPSEEK_API_KEY"),base_url="https://api.deepseek.com/v1")

这里有一个关键细节:base_url="https://api.deepseek.com/v1"用于指定模型服务的网络端点。若不声明,框架默认使用OpenAI的URL,但OpenAI并不识别DeepSeek模型,必然返回错误。再来看模型的入参messages,它采用数组结构,按system→human→system→human的顺序交替编排。system代表系统角色指令,human则是用户消息。上述示例仅包含两条消息,表示第一轮交互,其中第一条system用于预设模型的行为规范。

2. 构建向量数据库

RAG的本质流程:从向量数据库中检索相关语义片段,解析后返回给模型。这相当于为大模型外挂了一块“移动硬盘”。本文以一份“香蕉手机使用说明书.txt”作为示例数据。

数据处理流程如下:

第一步:将非结构化文本转换为统一的文档对象。

python# 加载txt文档def load_txt(txt_path):"""加载 TXT 文档并返回文档内容(适配LangChain分块格式)"""try:# 使用LangChain的文本加载器,兼容后续分块流程loader = TextLoader(txt_path, encoding="utf-8")documents = loader.load()print(f"成功加载 TXT,共 {len(documents)} 段")return documentsexcept Exception as e:print(f"加载 TXT 失败:{e}")return None

第二步:文本切割。

大模型存在输入长度限制,且token消耗与成本直接挂钩。因此需将长文本切分为若干较小的文本块(chunks)。常见的自动化切割方式如下:

python# 文本分割def split_documents(documents):"""将文档分割为文本块"""text_splitter = RecursiveCharacterTextSplitter(chunk_size=500,# 每个文本块的最大字符数chunk_overlap=50,# 文本块之间的重叠字符数(保持上下文连贯)length_function=len, # 长度计算函数separators=["nn", "n", "。", "!", "?", ",", "、", " "]# 分割符优先级)splits = text_splitter.split_documents(documents)print(f"文档分割完成,共生成 {len(splits)} 个文本块")return splits

然而在实践中,纯字符长度的硬切方式效果堪忧。因为算法严格按字符数截断,导致许多语义完整的段落被拦腰折断。建议先做预处理:在原文中用“##”手动标记语义分割点,再由代码按标记切分。

pythondef split_documents(documents):"""按 ## 分割文档(简单、稳定、绝不乱切)"""splits = []for doc in documents:# 核心:按 ## 把文本切开chunks = doc.page_content.split("##")for chunk in chunks:chunk = chunk.strip()# 去掉多余空格/换行if len(chunk) > 10:# 过滤空块new_doc = doc.copy()new_doc.page_content = chunksplits.append(new_doc)print(f"✅ 按 ## 分割完成,共生成 {len(splits)} 个文本块")return splits

这种方案的切割质量明显优于纯字符分割,有效保留了语义完整性。

第三步:创建向量库。

向量数据库本质上也是数据库,每条数据由三个核心部分组成:向量原始文本元数据

向量化是将文本转化为数值向量的过程,由嵌入模型负责。其原理是:经过训练的模型使语义相似的文本在向量空间中的距离更近,相异文本距离更远。余弦相似度定理表明,相似度值越小,文本语义越接近。

用户查询时,问题同样会被转化为查询向量,数据库通过索引快速检索最相似的k个文本块ID(k可自定义),随后根据ID提取对应的文本块和元数据返回。需要指出的是,无论调用的生成模型还是嵌入模型,既可选择远程API,也可下载本地模型运行。推荐后者,可显著降低网络延迟和潜在故障。

python# 创建向量库def create_vector_db(splits):"""创建 FAISS 向量数据库(使用本地 HuggingFace 嵌入模型)"""# 使用本地 sentence-transformers 模型(首次运行会自动下载,之后使用缓存)model_name = "sentence-transformers/all-MiniLM-L6-v2"embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2",model_kwargs={"local_files_only": True}# 强制本地模型)# 将文本块存入 FAISS 向量库vector_db = FAISS.from_documents(documents=splits, embedding=embeddings)vector_db.sa ve_local("./faiss_db")print("向量数据库创建完成(使用本地嵌入模型)")return vector_db

此外,从HuggingFace下载远程模型可能较慢,可通过修改环境变量切换镜像:

pythonos.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'

这样即可使用国内镜像加速模型下载。

局限性与反思

当然,RAG并非银弹。必须清醒认识到:人类客服能够根据图片、视觉信息给予反馈,而当前的AI仅能处理文本,无法识别图像内容。这是现阶段的一个明显短板,也是未来需要突破的方向。

4. 构建完整问答链

最后,我们来看如何搭建端到端的RAG问答链。

python# rag答疑链def build_rag_chain(vector_db):"""构建检索增强生成的问答链"""# 1. 创建检索器(返回最相关的3个文本块)retriever = vector_db.as_retriever(search_kwargs={"k": 2})# 加上这段!测试检索到了什么test_docs = retriever.invoke("怎么使用一起听功能")print("====检索到的内容====")for d in test_docs:print(d.page_content)# ----------------------# 2. 定义提示模板prompt_template = ChatPromptTemplate.from_template("""请根据以下提供的上下文信息回答用户的问题。如果你无法从上下文中找到答案,请明确说明"无法从知识库中找到相关答案",不要编造信息。上下文信息:{context}用户问题:{question}""")# 3. 初始化大模型llm = ChatOpenAI(model="deepseek-chat", temperature=0, api_key=os.getenv("DEEPSEEK_API_KEY"),# DeepSeek API Key, base_url="https://api.deepseek.com/v1"# DeepSeek API 基础地址)# 4. 构建 RAG 链,核心,链式语法是langchain的特色rag_chain = ({"context": retriever, "question": RunnablePassthrough()}# 检索上下文 + 传递用户问题| prompt_template# 格式化提示| llm# 调用大模型| StrOutputParser()# 解析输出为字符串)return rag_chain

注意:链式语法是LangChain的核心特性,必须熟练掌握。实际上,读到这里的同学应该已经明白:所谓RAG,这个听起来高大上的名词,本质上就是检索语义相关的文本块 + 构建提示词,让模型执行开卷考试。其中真正的技术细节在于检索chunks这一步。这一步做得越精细、越精准,最终回答的质量就越高。

最终测试代码这里不再赘述,直接运行即可观察效果。

来源:互联网

免责声明

本网站新闻资讯均来自公开渠道,力求准确但不保证绝对无误,内容观点仅代表作者本人,与本站无关。若涉及侵权,请联系我们处理。本站保留对声明的修改权,最终解释权归本站所有。

同类文章推荐

相关文章推荐

更多