老铁们,今天我们聊聊如何为你的聊天机器人添加工具。这个技术点其实不难,只要掌握了基本的聊天机器人、代理和聊天历史概念,你就能轻松驾驭。本文将带大家通过一个实战案例,创建一个能够进行网络搜索的对话代理。
技术背景介绍
我们的目标是创建一个可以通过调用工具与系统和API交互的聊天机器人。这里,我们将使用 Tavily 作为搜索工具的动力,也可以替换为类似功能的其他工具。
环境设置
首先,确保你在 Tavily 网站上注册了账户,并安装以下包:
%pip install --upgrade --quiet langchain-community langchain-openai tavily-python
接下来,要设置你的环境变量 OPENAI_API_KEY 和 TAVILY_API_KEY。
import dotenv
dotenv.load_dotenv()
原理深度解析
我们的聊天代理需要一个能调用工具的模型。在这里,我们使用了 OpenAI 的 gpt-3.5-turbo-1106 模型来实现这一功能。同时,我们的工具集成了 Tavily 的搜索结果。
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_openai import ChatOpenAI
tools = [TavilySearchResults(max_results=1)]
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
result = agent_executor.invoke({"messages": [HumanMessage(content="I'm Nemo!")]})
print(result['output']) # Expected output: Hello Nemo! It's great to meet you. How can I assist you today?
同时,对于需要查找信息的问题,代理会调用搜索工具:
result = agent_executor.invoke(
{
"messages": [
HumanMessage(content="What is the current conservation status of the Great Barrier Reef?")
],
}
)
print(result['output']) # Outputs the latest conservation status
优化建议分享
之前我踩过个小坑,工具调用的效率有时不尽如人意。后来发现使用 Tavily 平台解决了这个问题,它的稳定性和响应速度都能满足多数应用场景。
补充说明和总结
当然,你可以通过使用 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",
)
今天的技术分享就到这里,希望对大家有帮助。开发过程中遇到问题也可以在评论区交流~
—END—