使用LangChain AgentExecutor构建智能代理
语言模型(LLM)仅能输出文本,而不能执行具体操作。LangChain的一个重要应用是创建代理系统,这些系统使用LLM作为推理引擎来决定执行哪些操作以及这些操作的输入是什么。在本教程中,我们将构建一个能够与多个不同工具互动的代理,包括本地数据库和搜索引擎。您可以向该代理提问,观察它调用工具,并与其进行对话。我们将创建两个工具:Tavily和Retriever。
在本文中,我们将深入探讨如何使用LangChain的AgentExecutor构建智能代理。虽然这属于旧版的方式,但对于新手来说,这种方法可以快速上手。不过,随着项目复杂度的增加,您可能需要更高级的代理技术。LangGraph Agents或迁移指南将为您提供更多灵活性和控制力。
技术背景介绍
语言模型(LLM)仅能输出文本,而不能执行具体操作。LangChain的一个重要应用是创建代理系统,这些系统使用LLM作为推理引擎来决定执行哪些操作以及这些操作的输入是什么。在本教程中,我们将构建一个能够与多个不同工具互动的代理,包括本地数据库和搜索引擎。您可以向该代理提问,观察它调用工具,并与其进行对话。
核心原理解析
我们将涵盖以下概念:
- 使用语言模型的工具调用能力
- 创建Retriever以向代理暴露特定信息
- 使用SearchTool在线查找信息
- 支持历史聊天记录,让聊天机器人可以“记住”过去互动的内容
- 使用LangSmith调试和追踪应用程序
代码实现演示
环境配置
首先,安装LangChain:
pip install langchain
确保设置环境变量以启用LangSmith的追踪功能:
import getpass
import os
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()
定义工具
我们将创建两个工具:Tavily和Retriever。
Tavily工具
使用Tavily搜索引擎作为工具:
from langchain_community.tools.tavily_search import TavilySearchResults
search = TavilySearchResults(max_results=2)
result = search.invoke("what is the weather in SF")
print(result)
Retriever工具
创建一个Retriever:
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
loader = WebBaseLoader("https://docs.smith.langchain.com/overview")
docs = loader.load()
documents = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200).split_documents(docs)
vector = FAISS.from_documents(documents, OpenAIEmbeddings())
retriever = vector.as_retriever()
将Retriever转换为工具:
from langchain.tools.retriever import create_retriever_tool
retriever_tool = create_retriever_tool(
retriever,
"langsmith_search",
"Search for information about LangSmith. For any questions about LangSmith, you must use this tool!"
)
tools = [search, retriever_tool]
使用语言模型
选择一个语言模型并进行工具调用:
from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="gpt-4")
model_with_tools = model.bind_tools(tools)
response = model_with_tools.invoke([HumanMessage(content="What's the weather in SF?")])
print(f"ContentString: {response.content}")
print(f"ToolCalls: {response.tool_calls}")
创建代理
定义代理,并通过AgentExecutor执行工具调用:
from langchain.agents import create_tool_calling_agent, AgentExecutor
agent = create_tool_calling_agent(model, tools)
agent_executor = AgentExecutor(agent=agent, tools=tools)
response = agent_executor.invoke({"input": "hi!"})
print(response)
添加记忆功能
让代理能够记住过去的会话:
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory
store = {}
def get_session_history(session_id: str) -> BaseChatMessageHistory:
if session_id not in store:
store[session_id] = ChatMessageHistory()
return store[session_id]
agent_with_chat_history = RunnableWithMessageHistory(
agent_executor,
get_session_history,
input_messages_key="input",
history_messages_key="chat_history"
)
response = agent_with_chat_history.invoke({"input": "hi! I'm bob"}, config={"configurable": {"session_id": "<foo>"}})
print(response)
应用场景分析
这种基于工具调用的智能代理适用于多种场景,如客服聊天机器人、信息查询助理以及线上答疑平台等。
实践建议
- 初次使用LangChain代理时,建议从简单的工具调用开始,逐步增加复杂度。
- 尝试结合LangSmith调试工具,深入理解代理的行为。
- 为代理添加状态记忆功能,以提高用户体验。
如果遇到问题欢迎在评论区交流。
—END—
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)