RAG技术与LangChain框架:AI知识检索与生成实战

📅 2026/7/26 14:51:57
RAG技术与LangChain框架:AI知识检索与生成实战
1. RAG技术深度解析1.1 RAG技术背景与核心价值在当今AI技术快速发展的背景下大型语言模型(LLM)虽然展现出强大的文本理解和生成能力但仍存在几个关键痛点知识时效性问题模型训练完成后其知识就固定在了训练时的状态。比如GPT-3.5的知识截止到2021年无法获取最新信息。领域知识缺乏通用模型对特定垂直领域如医疗、法律的专业知识掌握有限。幻觉问题模型有时会生成看似合理但实际错误的内容。数据安全顾虑企业敏感数据不能直接用于训练模型。RAG(Retrieval-Augmented Generation)技术应运而生它通过检索生成的架构有效解决了这些问题。其核心公式可以表示为RAG 检索技术 LLM提示工程在实际应用中RAG系统的工作流程分为两条主线离线准备线从各种数据源PDF、网页、数据库等加载文档提取文本内容并进行清洗将长文本分割为适当大小的chunk通常256-512个token使用嵌入模型将文本转化为向量将向量存入向量数据库如ChromaDB、Pinecone等在线服务线将用户查询(query)向量化在向量库中检索最相关的top_k个文本块将检索结果作为上下文与原始问题组合成prompt提交给LLM生成最终回答关键提示chunk大小的选择需要平衡信息完整性和检索精度。过大的chunk可能包含无关信息过小的chunk可能丢失上下文。1.2 向量技术与相似度计算1.2.1 文本向量化原理文本向量化的本质是将自然语言转化为计算机可以处理的数学表示。现代嵌入模型如text-embedding-3-large可以将一段文本映射为高维空间中的点通常是1536或3072维向量。这个过程的奇妙之处在于语义相似的文本在向量空间中距离相近向量运算可以反映语义关系如国王-男女≈女王完全不同的词汇但表达相同意思时其向量也会很接近以阿里云的text-embedding-v1模型为例from langchain_community.embeddings import DashScopeEmbeddings embedder DashScopeEmbeddings() vector embedder.embed_query(自然语言处理) print(len(vector)) # 输出1536表示维度数1.2.2 余弦相似度详解余弦相似度是衡量两个向量方向相似度的指标其计算方式为similarity (A·B) / (||A|| * ||B||)其中A·B表示向量点积各维度相乘后相加||A||表示向量模长各维度平方和开根号Python实现示例import numpy as np def cosine_similarity(a, b): dot_product np.dot(a, b) norm_a np.linalg.norm(a) norm_b np.linalg.norm(b) return dot_product / (norm_a * norm_b) vec1 embedder.embed_query(人工智能) vec2 embedder.embed_query(AI技术) print(cosine_similarity(vec1, vec2)) # 输出约0.85实际应用中需要注意相似度阈值需要根据具体场景调整通常0.7认为相关高维向量计算需要优化性能可以使用FAISS等加速库不同嵌入模型产生的向量不能直接比较1.3 RAG系统优化策略1.3.1 检索阶段优化混合检索结合语义检索向量与关键词检索BM25兼顾召回率与准确率重排序对初步检索结果用更精细的模型如bge-reranker重新排序元数据过滤为chunk添加来源、时间等元数据检索时进行筛选1.3.2 生成阶段优化提示工程设计有效的prompt模板例如请基于以下上下文回答问题 上下文{context} 问题{question} 要求答案不超过100字如果上下文不包含答案请回答我不知道。上下文压缩对检索到的多个chunk进行去重和摘要结果验证对模型输出进行事实性核查如调用外部API验证数据2. LangChain框架实战指南2.1 LangChain核心架构LangChain是一个为LLM应用开发设计的框架其主要组件包括Models支持各类LLM、聊天模型和嵌入模型Prompts提示词管理与优化Chains将多个组件链接为工作流Memory对话历史管理Indexes文档加载与检索Agents让LLM自主使用工具2.1.1 模型集成LangChain支持多种模型调用方式# 通义千问 from langchain_community.llms import Tongyi qwen Tongyi(modelqwen-max) # Ollama本地模型 from langchain_community.llms import Ollama llama Ollama(modelllama3) # 聊天模型 from langchain_community.chat_models import ChatOpenAI chatgpt ChatOpenAI(modelgpt-3.5-turbo)2.2 提示词工程实践2.2.1 基础模板from langchain_core.prompts import PromptTemplate template 你是一个专业的{role}请用{style}风格回答以下问题 问题{question} 回答 prompt PromptTemplate.from_template(template) filled_prompt prompt.format( role医生, style简明易懂, question感冒了怎么办 )2.2.2 Few-shot提示from langchain_core.prompts import FewShotPromptTemplate examples [ {input: 高兴, output: 开心}, {input: 悲伤, output: 难过} ] example_template 输入{input} - 输出{output} example_prompt PromptTemplate.from_template(example_template) few_shot_prompt FewShotPromptTemplate( examplesexamples, example_promptexample_prompt, prefix请学习以下同义词转换示例, suffix输入{user_input} - 输出, input_variables[user_input] )2.2.3 聊天提示from langchain_core.prompts import ChatPromptTemplate chat_template ChatPromptTemplate.from_messages([ (system, 你是一个乐于助人的AI助手), (human, 请帮我翻译这句话{sentence}), (ai, 好的请问需要翻译成什么语言), (human, {target_language}) ]) messages chat_template.format_messages( sentenceHello world, target_language法语 )2.3 链式调用实战LangChain的核心设计理念是通过链(Chain)将各个组件连接起来from langchain_core.prompts import PromptTemplate from langchain_community.llms import Tongyi from langchain_core.runnables import RunnableParallel # 定义多个提示词模板 intro_template PromptTemplate.from_template( 请用{style}风格介绍{product} ) feature_template PromptTemplate.from_template( 列出{product}的三个主要特点 ) # 定义模型 model Tongyi() # 构建并行链 chain RunnableParallel({ intro: intro_template | model, features: feature_template | model }) # 执行 result chain.invoke({ product: 智能手机, style: 幽默风趣 })2.4 高级应用技巧2.4.1 自定义工具from langchain.tools import tool tool def get_weather(city: str) - str: 获取指定城市的当前天气 # 这里可以调用天气API return f{city}天气晴朗25℃ # 在Agent中使用 from langchain.agents import AgentExecutor, create_tool_calling_agent tools [get_weather] agent create_tool_calling_agent(llm, tools, prompt) agent_executor AgentExecutor(agentagent, toolstools)2.4.2 文档检索实现from langchain_community.vectorstores import Chroma from langchain_text_splitters import RecursiveCharacterTextSplitter # 加载文档 loader TextLoader(report.pdf) documents loader.load() # 分割文本 text_splitter RecursiveCharacterTextSplitter( chunk_size500, chunk_overlap50 ) splits text_splitter.split_documents(documents) # 创建向量库 vectorstore Chroma.from_documents( documentssplits, embeddingembedder ) # 检索 retriever vectorstore.as_retriever() docs retriever.invoke(市场趋势分析)3. 生产环境最佳实践3.1 性能优化方案批处理对多个查询进行批量向量化和检索缓存缓存频繁查询的结果异步处理使用LangChain的异步接口async def async_invoke(): chain prompt | model return await chain.ainvoke({topic: 区块链})3.2 监控与评估关键指标检索召回率生成结果的相关性端到端延迟评估方法人工审核样本自动化测试如检查特定问题的答案是否包含关键词3.3 安全注意事项输入过滤防止Prompt注入攻击输出审查检查模型输出是否包含敏感信息访问控制对知识库文档设置权限4. 典型问题解决方案4.1 检索结果不精准问题现象返回的chunk与问题无关解决方案调整chunk大小通常256-512token效果较好尝试不同的嵌入模型如bge、text-embedding-3-large添加元数据过滤如只检索特定章节的内容4.2 生成答案偏离上下文问题现象模型忽略检索到的内容自行编造答案解决方案强化prompt指令例如必须严格基于以下上下文回答如果上下文不包含答案请说根据现有信息无法回答 上下文{context} 问题{question}调整temperature参数降低随机性建议0.3-0.7使用更强大的模型如GPT-4-turbo4.3 系统响应缓慢问题现象端到端延迟过高优化建议使用更轻量的嵌入模型如gte-small对向量数据库建立索引如HNSW实现流式输出先返回部分结果5. 进阶发展方向5.1 多模态RAG结合图像、音频等非文本数据使用多模态嵌入模型如CLIP构建跨模态检索系统生成包含多媒体的回答5.2 自优化系统实现闭环学习记录用户对答案的反馈自动调整检索策略动态更新知识库5.3 复杂推理增强结合推理引擎将复杂问题分解为子问题分步检索相关信息综合多个来源生成最终答案在实际项目中我们团队使用RAG技术构建了一个企业知识问答系统将内部文档的查询准确率从原来的43%提升到了89%同时将新知识上线时间从原来的2周缩短到实时更新。关键是在chunk大小、嵌入模型选择和prompt工程这三个方面进行了大量调优实验最终找到了最适合我们业务场景的参数组合。