ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

20分钟快速构建LangChain智能体:文档问答实战

20分钟快速构建LangChain智能体:文档问答实战 1. 项目概述20分钟快速构建LangChain智能体去年我在一个企业知识库项目中首次接触LangChain时花了整整三天才搞明白如何搭建一个基础问答系统。现在回头看其实用LangChain开发一个功能完善的智能体Agent20分钟真的足够了。本文将以一个文档问答Agent为例带你快速掌握LangChain Agent开发的核心技巧。这个智能体的核心功能是基于LangChain官方文档构建知识库当用户提出技术问题时它能自动检索相关文档片段通过子智能体Subagent并行分析多个文档片段最终合成专业回答。整个过程涉及工具调用、任务分解、并行处理等典型Agent能力是学习LangChain的理想入门项目。2. 环境准备与依赖安装2.1 基础环境配置建议使用Python 3.9环境我习惯用conda创建独立环境conda create -n langchain-agent python3.9 conda activate langchain-agent2.2 核心依赖安装这些是开发LangChain Agent必需的库pip install langchain-core langchain-openai deepagents pip install langchain-text-splitters requests注意如果遇到依赖冲突可以先安装langchain-core再安装其他组件。我遇到过langchain-community与新版langchain-core不兼容的情况指定版本号可以解决pip install langchain-core0.1.02.3 模型API配置示例使用OpenAI的GPT-4模型你需要准备OpenAI API密钥在环境变量中设置import os os.environ[OPENAI_API_KEY] 你的API密钥如果无法访问OpenAI也可以使用本地模型如Ollamafrom langchain_community.llms import Ollama llm Ollama(modelllama3)3. Agent核心架构设计3.1 整体工作流程我们的文档问答Agent采用经典RAG架构检索(Retrieve)用向量数据库搜索相关文档片段分析(Analyze)子智能体并行处理文档片段生成(Generate)主智能体综合所有分析结果生成最终回答3.2 关键技术组件组件类型实现方案作用文本分割器RecursiveCharacterTextSplitter将长文档切分为可处理的片段向量数据库InMemoryVectorStore存储和检索文档片段主智能体create_deep_agent协调整个问答流程子智能体chunk-analyst分析单个文档片段4. 文档处理与索引构建4.1 文档加载实现我们从LangChain官方文档网站加载技术文档from langchain_core.documents import Document import requests def load_docs(doc_urls): docs [] for url in doc_urls: try: resp requests.get(url, timeout10) docs.append(Document( page_contentresp.text, metadata{source: url} )) except Exception as e: print(f加载失败 {url}: {str(e)}) return docs doc_urls [ https://docs.langchain.com/docs/agents, https://docs.langchain.com/docs/retrieval ] documents load_docs(doc_urls)4.2 文本分块策略文档分块是RAG系统的关键我的经验是技术文档适合800-1200字符的块大小设置200字符的重叠区域防止关键信息被切断from langchain_text_splitters import RecursiveCharacterTextSplitter text_splitter RecursiveCharacterTextSplitter( chunk_size1000, chunk_overlap200, separators[\n\n, \n, 。, , ] ) splits text_splitter.split_documents(documents)4.3 向量存储配置使用内存型向量数据库简化示例from langchain_openai import OpenAIEmbeddings from langchain_core.vectorstores import InMemoryVectorStore embeddings OpenAIEmbeddings(modeltext-embedding-3-small) vector_store InMemoryVectorStore.from_documents( documentssplits, embeddingembeddings )生产环境建议使用Pinecone或Chroma等专业向量数据库。我在实际项目中发现当文档超过1万条时内存数据库的性能会显著下降。5. 智能体核心功能实现5.1 搜索工具开发这是Agent与向量数据库交互的关键工具from deepagents.backends import StateBackend from langchain.tools import tool import uuid backend StateBackend() tool def search_docs(query: str) - list: 检索与问题相关的文档片段 results vector_store.similarity_search(query, k3) # 将结果保存到临时文件供子智能体读取 batch_id uuid.uuid4().hex[:6] saved_paths [] for i, doc in enumerate(results): path f/retrieved/{batch_id}/doc_{i}.txt content f来源: {doc.metadata[source]}\n内容: {doc.page_content} backend.upload_file(path, content.encode(utf-8)) saved_paths.append(path) return saved_paths5.2 子智能体配置子智能体专门分析单个文档片段chunk_analyst { name: doc-analyst, description: 分析单个文档片段, system_prompt: 你是一个技术文档分析专家。请根据用户问题从指定文档片段中提取关键信息。 要求 1. 只基于提供的文档内容回答 2. 保持回答简洁专业 3. 必须注明文档来源 }5.3 主智能体创建整合所有组件创建主智能体from deepagents import create_deep_agent from langchain.chat_models import ChatOpenAI agent create_deep_agent( modelChatOpenAI(modelgpt-4), tools[search_docs], backendbackend, system_prompt你是LangChain技术专家请按以下流程回答问题 1. 用search_docs工具检索相关文档 2. 为每个文档片段创建分析任务 3. 综合所有分析结果生成最终回答, subagents[chunk_analyst] )6. 智能体测试与优化6.1 基础功能测试question LangChain Agent如何调用工具 result agent.invoke({messages: [{content: question}]}) print(result[messages][-1][content])预期输出应包含工具调用的基本方法相关代码示例文档来源链接6.2 性能优化技巧通过实际测试发现的优化点并发控制设置合理的子智能体并发数通常3-5个agent create_deep_agent( ... max_concurrent_subagents3 )结果缓存对常见问题实现答案缓存from langchain.cache import InMemoryCache from langchain.globals import set_llm_cache set_llm_cache(InMemoryCache())检索优化调整相似度搜索参数results vector_store.similarity_search( query, k5, # 返回结果数 score_threshold0.7 # 相似度阈值 )7. 生产环境部署建议7.1 安全注意事项输入过滤防止Prompt注入攻击import re def sanitize_input(text): return re.sub(r[^\w\s.,?], , text)[:500]输出审查确保回答的准确性def validate_answer(answer): if 我不知道 in answer: raise ValueError(回答不完整) if not any(url in answer for url in doc_urls): print(警告回答未引用文档)7.2 监控与日志建议添加from langsmith import Client client Client() client.create_project(DocQA-Agent) def log_interaction(question, answer): client.create_example( inputs{question: question}, outputs{answer: answer}, project_nameDocQA-Agent )8. 常见问题排查8.1 检索相关问题问题检索结果不相关解决检查嵌入模型是否匹配text-embedding-3-small最适合英文调整分块策略技术文档可能需要更小的块500-800字符8.2 子智能体问题问题子智能体不返回结果检查确认文件路径是否正确检查子智能体的system_prompt是否明确查看LangSmith跟踪日志8.3 性能问题问题响应速度慢优化限制子智能体响应长度chunk_analyst[system_prompt] \n请将回答限制在200字以内使用更快的模型如gpt-3.5-turbo9. 项目扩展方向这个基础Agent可以进一步扩展多模态支持处理图片、PDF等格式文档from langchain.document_loaders import PyPDFLoader loader PyPDFLoader(manual.pdf) pages loader.load()对话记忆添加聊天历史功能from langchain.memory import ConversationBufferMemory memory ConversationBufferMemory() agent create_deep_agent( ..., memorymemory )自动验证添加事实核查子智能体fact_checker { name: fact-checker, description: 验证回答的准确性, system_prompt: 检查技术回答是否符合官方文档... }我在实际项目中发现开发一个基础Agent确实可以在20分钟内完成但要打造生产级应用还需要在异常处理、性能优化等方面投入更多时间。建议先从这个小项目开始逐步添加更复杂的功能。
返回列表