ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

LangChain实战指南:从Prompt工程到RAG与Agent开发

LangChain实战指南:从Prompt工程到RAG与Agent开发 最近在接触大模型应用开发时发现很多同学对 LangChain 这个框架既好奇又畏惧——功能强大但学习曲线陡峭网上资料要么过于简单要么版本过时。本文基于真实项目经验整合一套从 Prompt 工程到 RAG 知识库再到 Agent 智能体的完整实战指南所有代码均经过验证帮你避开版本兼容、API 调用、架构设计中的常见陷阱。无论你是刚接触大模型的在校学生还是需要快速落地智能应用的后端工程师都能通过本文掌握 LangChain 的核心用法。下面我们直接用代码说话从环境搭建到项目实战20分钟带你打通任督二脉1. LangChain 核心概念与生态定位1.1 什么是 LangChain为什么需要它LangChain 是一个用于构建大模型应用的框架它解决了直接调用大模型 API 时的几个核心痛点上下文管理大模型有 token 限制LangChain 提供了文本分割、摘要、上下文窗口管理等能力模块化设计将复杂的 AI 应用拆分为可复用的组件Prompts、Chains、Agents 等工具集成轻松连接外部数据源、API 接口、计算工具状态管理处理多轮对话、记忆存储等复杂状态简单来说如果你直接调用 OpenAI API 只能完成一次简单的问答而使用 LangChain 可以构建出能联网搜索、查询数据库、执行代码的智能助手。1.2 LangChain 核心组件架构LangChain 的架构围绕以下几个核心概念构建Prompts提示词模板支持变量插值、少量示例等Models抽象了不同厂商的大模型接口OpenAI、通义千问、智谱AI等Chains将多个组件串联成工作流Agents让大模型自主选择工具完成任务Memory管理对话历史和状态Indexes文档加载、分割、向量化等 RAG 相关功能这种模块化设计让开发者可以像搭积木一样构建复杂应用而不是每次都从头开始。1.3 LangChain 与相关技术对比在实际项目中经常需要区分 LangChain 与其他相似技术LangChain vs LangGraphLangGraph 专注于多步骤工作流和状态管理更适合复杂的 Agent 场景LangChain vs 直接调用 API当应用需要工具调用、记忆管理或复杂流程时LangChain 更有优势RAG 框架选择LangChain 提供完整的 RAG 流水线但企业级场景可能还需要考虑性能优化和监控理解这些区别有助于在具体项目中做出合适的技术选型。2. 环境准备与版本兼容性2.1 基础环境要求在开始编码前需要确保开发环境准备就绪# 推荐使用 Python 3.8-3.11 版本 python --version # Python 3.9.18 # 创建虚拟环境推荐 python -m venv langchain-env source langchain-env/bin/activate # Linux/Mac # langchain-env\Scripts\activate # Windows2.2 关键依赖安装与版本匹配LangChain 生态的版本兼容性是最大的坑点之一下面是经过验证的稳定组合# 核心库 pip install langchain0.1.0 pip install langchain-community0.0.10 pip install langchain-core0.1.0 # 可选组件根据需求安装 pip install langchain-openai0.0.5 # OpenAI 集成 pip install langchain-chroma0.1.0 # 向量数据库 pip install langchain-text-splitters0.0.1 # 文本分割 # 工具类 pip install python-dotenv1.0.0 # 环境变量管理重要版本说明如果你使用的是 LangChain 0.1.x 版本langchain-community 0.0.x 是兼容的。避免混合使用不同大版本的包否则会出现导入错误或功能异常。2.3 API 密钥配置创建.env文件管理敏感信息# .env 文件内容 OPENAI_API_KEYsk-your-openai-key-here # 其他厂商的 API 密钥 QIANFAN_AKyour-qianfan-ak QIANFAN_SKyour-qianfan-sk加载配置的代码from dotenv import load_dotenv import os load_dotenv() openai_api_key os.getenv(OPENAI_API_KEY) if not openai_api_key: raise ValueError(请检查 .env 文件中的 OPENAI_API_KEY 配置)3. Prompt 工程实战从基础到高级3.1 基础 Prompt 模板使用Prompt 模板是 LangChain 中最基础但最重要的组件from langchain.prompts import PromptTemplate # 基础模板示例 template 你是一个专业的{role}请用{style}风格回答以下问题 问题{question} 回答 prompt PromptTemplate( input_variables[role, style, question], templatetemplate ) # 填充模板 filled_prompt prompt.format( role机器学习工程师, style简洁专业, question什么是过拟合 ) print(filled_prompt)输出结果你是一个专业的机器学习工程师请用简洁专业风格回答以下问题 问题什么是过拟合 回答3.2 少量示例Few-ShotPrompt对于复杂任务提供示例能显著提升模型表现from langchain.prompts import FewShotPromptTemplate, PromptTemplate # 定义示例 examples [ { input: 这家餐厅的服务很好但食物一般, output: 正面服务态度好\n负面食物质量一般 }, { input: 产品功能强大就是价格太贵, output: 正面功能强大\n负面价格偏高 } ] # 定义单个示例的格式 example_template 输入{input} 输出{output} example_prompt PromptTemplate( input_variables[input, output], templateexample_template ) # 创建 FewShotPromptTemplate few_shot_prompt FewShotPromptTemplate( examplesexamples, example_promptexample_prompt, prefix请将以下用户评论进行情感分析分别列出正面和负面观点, suffix输入{user_input}\n输出, input_variables[user_input], example_separator\n\n ) result few_shot_prompt.format(user_input手机拍照效果很棒但电池续航太短) print(result)3.3 常见 Prompt 错误与调试技巧在实际使用中经常会遇到以下问题问题1变量未定义错误# 错误示例template 中使用了未在 input_variables 中声明的变量 try: prompt PromptTemplate( input_variables[question], # 缺少 role 变量 template作为{role}我认为{question}的答案是... ) except Exception as e: print(f错误{e})解决方案确保所有模板变量都在 input_variables 中声明。问题2系统消息位置错误api error: 400 failed to build prompt: system message must be at the beginning解决方案在构建对话 prompt 时系统消息必须放在最开始from langchain.schema import SystemMessage, HumanMessage # 正确方式 messages [ SystemMessage(content你是一个有帮助的助手), HumanMessage(content你好请介绍你自己) ] # 错误方式系统消息不在开头 # messages [ # HumanMessage(content你好), # SystemMessage(content你是一个助手) # 这会导致 API 错误 # ]4. RAG 知识库构建全流程4.1 RAG 系统原理与架构RAGRetrieval-Augmented Generation通过以下流程增强模型的知识能力文档加载从各种来源加载文档文本分割将长文档切分为适合处理的片段向量化将文本转换为向量表示检索根据问题找到最相关的文档片段生成结合检索结果生成最终答案这种架构让模型能够访问外部知识减少幻觉现象。4.2 文档加载与预处理首先准备示例文档并进行处理from langchain.document_loaders import TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter # 创建示例文档 with open(sample_doc.txt, w, encodingutf-8) as f: f.write(机器学习是人工智能的重要分支。深度学习是机器学习的一种方法。 神经网络由多个层次组成。过拟合是指模型在训练集上表现太好而在测试集上表现差。 正则化可以防止过拟合。交叉验证用于评估模型性能。) # 加载文档 loader TextLoader(sample_doc.txt) documents loader.load() # 文本分割 text_splitter RecursiveCharacterTextSplitter( chunk_size100, # 每个片段大约100字符 chunk_overlap20, # 片段间重叠20字符 length_functionlen ) split_docs text_splitter.split_documents(documents) print(f原始文档数{len(documents)}分割后片段数{len(split_docs)}) for i, doc in enumerate(split_docs[:2]): print(f片段{i1}: {doc.page_content[:50]}...)4.3 向量存储与检索使用 Chroma 作为向量数据库from langchain.vectorstores import Chroma from langchain.embeddings import OpenAIEmbeddings # 初始化嵌入模型 embeddings OpenAIEmbeddings(openai_api_keyopenai_api_key) # 创建向量数据库 vectorstore Chroma.from_documents( documentssplit_docs, embeddingembeddings, persist_directory./chroma_db ) # 检索相似内容 query 什么是过拟合如何防止 similar_docs vectorstore.similarity_search(query, k2) print(检索到的相关文档) for i, doc in enumerate(similar_docs): print(f{i1}. {doc.page_content})4.4 完整 RAG 链实现将检索器和生成模型组合成完整流程from langchain.chains import RetrievalQA from langchain.chat_models import ChatOpenAI # 初始化 LLM llm ChatOpenAI( model_namegpt-3.5-turbo, openai_api_keyopenai_api_key, temperature0 ) # 创建 RAG 链 qa_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, # 简单地将检索结果堆叠 retrievervectorstore.as_retriever(), return_source_documentsTrue ) # 提问测试 question 请解释过拟合以及防止方法 result qa_chain({query: question}) print(答案, result[result]) print(\n参考来源) for doc in result[source_documents][:2]: print(f- {doc.page_content[:100]}...)5. Agent 智能体开发实战5.1 Agent 核心概念与类型Agent 是大模型工具的组合让模型能够主动使用外部工具解决问题。主要类型包括Zero-shot ReAct Agent不需要示例直接根据工具描述选择Conversational Agent支持多轮对话的智能体Plan-and-Execute Agent先制定计划再执行复杂任务5.2 工具定义与注册首先定义 Agent 可以使用的工具from langchain.agents import tool from datetime import datetime tool def get_current_time() - str: 获取当前日期和时间 return datetime.now().strftime(%Y-%m-%d %H:%M:%S) tool def calculate_bmi(weight: float, height: float) - dict: 计算身体质量指数(BMI) Args: weight: 体重千克 height: 身高米 Returns: dict: 包含BMI值和分类的字典 bmi weight / (height ** 2) if bmi 18.5: category 偏瘦 elif bmi 24: category 正常 elif bmi 28: category 偏胖 else: category 肥胖 return {bmi: round(bmi, 2), category: category} # 工具列表 tools [get_current_time, calculate_bmi]5.3 智能体初始化与运行创建能够使用工具的智能体from langchain.agents import initialize_agent, AgentType from langchain.chat_models import ChatOpenAI # 初始化模型 llm ChatOpenAI( model_namegpt-3.5-turbo, openai_api_keyopenai_api_key, temperature0 ) # 创建智能体 agent initialize_agent( toolstools, llmllm, agentAgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION, verboseTrue, # 显示详细执行过程 handle_parsing_errorsTrue # 处理解析错误 ) # 测试智能体 try: result agent.run(我体重70公斤身高1.75米我的BMI是多少现在是什么时间) print(智能体回答, result) except Exception as e: print(f执行错误{e})5.4 复杂任务规划与执行对于需要多步骤的任务使用更高级的 Agent# 复杂工具定义 tool def search_web(query: str) - str: 模拟网络搜索功能 # 实际项目中这里会集成真实的搜索API return f关于{query}的搜索结果相关资讯1相关资讯2 tool def send_email(recipient: str, subject: str, body: str) - str: 模拟发送邮件功能 return f已发送邮件给{recipient}主题{subject} # 扩展工具集 advanced_tools tools [search_web, send_email] # 创建高级智能体 advanced_agent initialize_agent( toolsadvanced_tools, llmllm, agentAgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION, verboseTrue, max_iterations3 # 限制最大迭代次数防止无限循环 ) # 测试复杂任务 complex_task 搜索今天的人工智能新闻然后总结主要内容并发送到testexample.com try: result advanced_agent.run(complex_task) print(任务执行结果, result) except Exception as e: print(f复杂任务执行失败{e})6. 常见问题与深度排查6.1 版本兼容性问题问题现象ImportError: cannot import name XYZ from langchain解决方案检查版本匹配pip list | grep langchain使用兼容版本组合如本文 2.2 节推荐清理重装pip uninstall langchain langchain-community pip install 指定版本6.2 API 调用错误问题现象APIError: 400 - Invalid request found排查步骤检查 API 密钥是否正确设置验证 API 端点是否可访问查看请求格式是否符合厂商要求确认额度或频次限制# API 健康检查示例 import openai def check_api_health(): try: openai.api_key os.getenv(OPENAI_API_KEY) models openai.Model.list() print(API 连接正常) return True except Exception as e: print(fAPI 连接失败{e}) return False6.3 内存管理问题问题现象长对话中模型忘记之前的内容解决方案使用 ConversationBufferMemoryfrom langchain.memory import ConversationBufferMemory memory ConversationBufferMemory( memory_keychat_history, return_messagesTrue ) # 在 Chain 或 Agent 中集成 memory from langchain.chains import ConversationChain conversation ConversationChain( llmllm, memorymemory, verboseTrue ) # 测试多轮对话 response1 conversation.predict(input你好我是小明) response2 conversation.predict(input你还记得我的名字吗) print(response2)6.4 性能优化技巧批量处理对多个文档或查询进行批量嵌入计算缓存机制对重复查询结果进行缓存异步处理使用异步接口提高并发性能import asyncio from langchain.cache import InMemoryCache from langchain.globals import set_llm_cache # 启用缓存 set_llm_cache(InMemoryCache()) # 异步示例 async def async_embedding_example(): texts [文本1, 文本2, 文本3] embeddings OpenAIEmbeddings() # 批量嵌入 results await embeddings.aembed_documents(texts) return results7. 生产环境最佳实践7.1 安全考虑与防护措施Prompt 注入防护def sanitize_input(user_input: str) - str: 简单的输入清洗 # 移除可能危险的模式 dangerous_patterns [ 忽略之前指令, 作为AI模型, 系统提示词 ] cleaned_input user_input for pattern in dangerous_patterns: cleaned_input cleaned_input.replace(pattern, ) return cleaned_input.strip() # 在处理用户输入前进行清洗 safe_input sanitize_input(user_input)API 访问控制使用环境变量管理密钥设置合理的 API 调用频率限制记录审计日志7.2 错误处理与重试机制构建健壮的生产级应用from tenacity import retry, stop_after_attempt, wait_exponential from langchain.callbacks.manager import get_openai_callback retry(stopstop_after_attempt(3), waitwait_exponential(multiplier1, min4, max10)) def robust_llm_call(prompt: str, llm): 带重试机制的LLM调用 try: with get_openai_callback() as cb: response llm.invoke(prompt) print(f本次调用消耗token数{cb.total_tokens}) return response except Exception as e: print(fLLM调用失败{e}) raise # 使用示例 try: result robust_llm_call(你好请简单介绍自己, llm) print(result.content) except Exception as e: print(f最终执行失败{e})7.3 监控与日志记录建立完整的可观测性体系import logging from datetime import datetime # 配置日志 logging.basicConfig( levellogging.INFO, format%(asctime)s - %(name)s - %(levelname)s - %(message)s, handlers[ logging.FileHandler(langchain_app.log), logging.StreamHandler() ] ) logger logging.getLogger(__name__) def monitored_agent_run(agent, query: str): 带监控的Agent执行 start_time datetime.now() logger.info(f开始执行查询: {query}) try: result agent.run(query) duration (datetime.now() - start_time).total_seconds() logger.info(f查询执行成功耗时: {duration:.2f}秒) return result except Exception as e: logger.error(f查询执行失败: {e}) raise7.4 部署与扩展考虑容器化部署# Dockerfile 示例 FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD [python, app.py]配置管理# config.py import os from dataclasses import dataclass dataclass class AppConfig: openai_api_key: str os.getenv(OPENAI_API_KEY) model_name: str os.getenv(MODEL_NAME, gpt-3.5-turbo) max_retries: int int(os.getenv(MAX_RETRIES, 3)) timeout: int int(os.getenv(TIMEOUT, 30)) config AppConfig()8. 项目实战构建智能技术问答系统8.1 系统架构设计结合前面所学构建一个完整的智能问答系统用户问题 → 意图识别 → 知识库检索 → 答案生成 → 结果返回 ↓ ↓ ↓ ↓ 输入处理 分类模型 向量数据库 大模型生成8.2 核心代码实现import os from typing import Dict, List from langchain import VectorStore from langchain.embeddings import OpenAIEmbeddings from langchain.vectorstores import Chroma from langchain.chat_models import ChatOpenAI from langchain.agents import Tool, initialize_agent from langchain.memory import ConversationBufferMemory class TechQASystem: def __init__(self, vectorstore_path: str, api_key: str): self.embeddings OpenAIEmbeddings(openai_api_keyapi_key) self.vectorstore Chroma( persist_directoryvectorstore_path, embedding_functionself.embeddings ) self.llm ChatOpenAI( model_namegpt-3.5-turbo, openai_api_keyapi_key, temperature0.3 ) self.memory ConversationBufferMemory(memory_keychat_history) self.setup_agent() def setup_agent(self): 设置问答Agent # 定义检索工具 def search_docs(query: str) - str: docs self.vectorstore.similarity_search(query, k3) return \n\n.join([doc.page_content for doc in docs]) tools [ Tool( name技术文档搜索, funcsearch_docs, description用于搜索技术文档和知识库内容 ) ] # 初始化Agent self.agent initialize_agent( toolstools, llmself.llm, agentAgentType.CONVERSATIONAL_REACT_DESCRIPTION, memoryself.memory, verboseTrue, handle_parsing_errorsTrue ) def ask_question(self, question: str) - str: 提问接口 try: response self.agent.run(question) return response except Exception as e: return f抱歉回答问题时报错{str(e)} # 使用示例 if __name__ __main__: qa_system TechQASystem( vectorstore_path./chroma_db, api_keyos.getenv(OPENAI_API_KEY) ) # 测试问答 questions [ 什么是机器学习中的过拟合, 如何防止过拟合, 深度学习和机器学习有什么关系 ] for question in questions: print(f问题{question}) answer qa_system.ask_question(question) print(f答案{answer}\n{-*50})8.3 系统优化与扩展性能优化实现检索结果缓存支持异步处理并发请求添加查询预处理和重写功能扩展集成多数据源数据库、API、文件系统支持多模态输入输出添加用户反馈和学习机制通过这个实战项目你可以看到 LangChain 如何将各个组件有机组合构建出功能完整的 AI 应用。9. 学习路径与进阶方向9.1 新手到精通的路线图基础阶段1-2周掌握 Prompt 工程基础理解 Chain 的概念和使用学会基本的文档处理流程进阶阶段2-4周深入理解 Agent 工作机制掌握向量数据库的使用学习内存管理和状态维护高级阶段1-2月源码阅读和自定义组件开发性能优化和生产部署复杂系统架构设计9.2 推荐学习资源官方文档langchain.com/docs最新最权威社区项目GitHub 上的热门 LangChain 项目实践平台在真实业务场景中应用所学知识技术博客关注相关领域的技术更新和最佳实践9.3 常见职业发展方向AI 应用开发工程师专注于基于大模型的业务应用开发Prompt 工程师深度优化模型提示词和交互设计RAG 系统架构师设计和管理企业级知识库系统AI Agent 开发专家构建自主智能体和复杂工作流本文从最基础的 Prompt 工程到复杂的 Agent 开发提供了完整的代码示例和实战经验。建议按照章节顺序动手实践遇到问题多查阅官方文档和社区讨论。在实际项目中记得从简单功能开始迭代逐步增加复杂度。LangChain 生态更新很快保持学习心态关注版本变化你就能在大模型应用开发的道路上越走越远。
返回列表