LangChain 构建智能多工具 Agent实践

前言

在智能应用的浪潮中,语言模型(LLM)不再只是文本生成器,而是具备调用外部工具、检索数据、搜索互联网信息、甚至记忆上下文的"智能体"(Agent)。借助 LangChain 框架,我们可以轻松地创建一个能与多种不同工具交互的 Agent,让它具备信息检索、搜索和多轮对话记忆的能力。

本文将深入解析如何:

  • 使用语言模型的 工具调用能力
  • 创建并封装 本地数据库检索器(Retriever)
  • 集成 在线搜索工具
  • 构建一个可 多轮对话记忆 的智能 Agent;
  • 通过示例代码展示从初始化到运行的完整过程。

1. Agent 系统架构概览

整个 Agent 系统由四个核心组件构成:

层级 模块 功能说明
检索层 Retriever 从本地索引或文档源检索相关信息
工具层 Tool 将检索器、本地数据库和搜索引擎封装成可供 LLM 调用的函数接口
Agent 层 Planner / Agent 驱动 LLM,根据上下文和需求动态选择工具并整合结果
记忆层 Memory user_id 存储对话历史,使 Agent 能进行多轮上下文对话

下图展示了整体流程:

复制代码
User Query → Agent (LLM) → Tool 调用决策
     ↓                   ↓
 Memory ← 结果 ← Retriever / Web Search

2. 环境准备与依赖版本

组件 推荐版本
Python ≥ 3.10
langchain 0.1xx
openai ≥ 0.27.0
向量数据库 faiss-cpu 或 chromadb
其他依赖 tiktoken、requests

确保在环境变量中配置好 OPENAI_API_KEY,并安装上述库:

bash 复制代码
pip install langchain openai faiss-cpu tiktoken requests

3. 构建 Retriever:从 URL 到索引

我们首先从一个网页抓取内容,将其拆分、向量化,并建立索引,最终形成一个可检索的 Retriever。

python 复制代码
from langchain.text_splitter import CharacterTextSplitter
from langchain.document_loaders import UnstructuredURLLoader
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS

 1. 加载网页内容
urls = ["https://example.com/some-article.html"]
loader = UnstructuredURLLoader(urls=urls)
docs = loader.load()

 2. 拆分文档块
splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
doc_chunks = splitter.split_documents(docs)

 3. 生成向量索引
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(doc_chunks, embeddings)

 4. 创建检索器
retriever = vectorstore.as_retriever(search_kwargs={"k": 4})

通过这种方式,我们获得了一个本地知识库的检索接口。


4. 封装工具:让 LLM 能调用 Retriever 与搜索引擎

4.1 本地检索工具

python 复制代码
def local_retriever_tool(query: str) -> str:
    docs = retriever.get_relevant_documents(query)
    return "\n---\n".join([d.page_content for d in docs])

from langchain.tools import Tool
local_retriever = Tool(
    name="local_retriever",
    func=local_retriever_tool,
    description="从本地索引中检索与查询相关的文档片段。"
)

4.2 在线搜索工具

示例中我们使用 SerpAPI(你也可以换成 Bing 或 Google Custom Search):

python 复制代码
import requests
SERPAPI_KEY = os.environ.get('SERPAPI_KEY')

def serp_search_tool(query: str) -> str:
    params = {'engine': 'google', 'q': query, 'api_key': SERPAPI_KEY}
    resp = requests.get('https://serpapi.com/search', params=params)
    data = resp.json()
    snippets = []
    for r in data.get('organic_results', [])[:5]:
        snippets.append(f"{r.get('title')} - {r.get('snippet', '')} ({r.get('link')})")
    return "\n".join(snippets)

search_tool = Tool(
    name="web_search",
    func=serp_search_tool,
    description="使用在线搜索引擎检索最新的信息,返回摘要和链接。"
)

5. 创建并运行 Agent

现在我们把所有组件整合起来,构建可交互的智能 Agent。

python 复制代码
from langchain import OpenAI
from langchain.agents import initialize_agent, AgentType
from langchain.memory import ConversationBufferMemory

llm = OpenAI(temperature=0)
tools = [local_retriever, search_tool]
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)

agent = initialize_agent(
    tools,
    llm,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    verbose=True,
    memory=memory
)

question = "请基于本地索引中的资料,说明 example.com 上关于 X 的关键观点;如果没有,在线搜索最新资料。"
result = agent.run(question)
print(result)

运行后,你会看到 Agent 自动决定调用哪个工具(本地或网络),并整合结果生成自然语言回答。


6. 多用户对话记忆机制

为不同用户维护独立的上下文,可以让 Agent 记住每个用户的历史对话:

python 复制代码
from collections import defaultdict
from langchain.memory import ConversationBufferMemory

user_memories = defaultdict(lambda: ConversationBufferMemory(memory_key="chat_history", return_messages=True))

user_id = "user_123"
memory = user_memories[user_id]
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, memory=memory)

agent.run("上次我们关于 X 的讨论,请继续。")

在生产系统中,你可以把 memory 存储在 Redis、Postgres 等外部数据库中,并定期做摘要压缩,避免上下文过长。


7. 实践建议

  1. 限制工具输出长度:对检索内容先摘要,避免 token 超限。
  2. 安全沙箱:对搜索结果做可信度检查,防止注入恶意内容。
  3. 函数调用模式:可结合 OpenAI 的 Function Calling,把工具注册为可调用函数。
  4. 缓存与并发控制:对频繁调用的外部工具结果进行缓存,设置超时重试。
  5. 日志与解释性:保存 Agent 调用链路以便调试与审计。

8. 总结

本文完整展示了如何利用 LangChain 构建一个能与本地数据库和搜索引擎交互的智能 Agent。通过整合 Retriever、Tool、Memory 模块,Agent 能够根据用户需求自动选择合适的信息源,执行多轮对话,并保持记忆。

未来,你可以进一步拓展:

  • 使用 ChatOpenAI 与 Function Calling 构建更智能的决策代理;
  • 将索引替换为 Chroma 或 Milvus 实现分布式知识库;
  • 接入网页、PDF、数据库等多种数据源,实现真正的知识增强型 AI 助手。

这就是一个具备检索、搜索与记忆能力的 LangChain 多工具智能体的全貌。


参考资料

  1. LangChain 官方文档
  2. OpenAI API 参考文档
  3. FAISS 向量数据库 GitHub
  4. Chroma 向量数据库官方文档
  5. LangChain Memory 模块介绍
  6. LangChain Agents 指南
相关推荐
大模型教程2 小时前
大模型“进修深造”(Fine-tuning):用微调打造“懂行”的智能客服
程序员·llm·agent
大模型教程3 小时前
30分钟内搞定!在本地电脑上部署属于你自己的大模型
llm·agent·ollama
Juchecar3 小时前
翻译:什么是认知架构?- LangChain
agent
FreeCode4 小时前
LangChain 1.0智能体开发:记忆组件
人工智能·langchain·agent
悟乙己4 小时前
使用 RAG、LangChain、FastAPI 和 Streamlit 构建 Text-to-SQL 聊天机器人
sql·langchain·fastapi
serve the people5 小时前
Prompt Serialization in LangChain
数据库·langchain·prompt
AI Echoes5 小时前
LangChain 使用语义路由选择不同的Prompt模板
人工智能·python·langchain·prompt·agent
后端小肥肠5 小时前
10W+育儿漫画是怎么做的?我用n8n搭建了自动化工作流,3分钟生成到本地磁盘
人工智能·aigc·agent