使用 LangChain 和 LangGraph 构建工具调用对话式 AI初学者指南
人工智能的世界正在迅速发展,使得创建对话式 AI 系统比以往任何时候都更加容易。两种正在革新这一领域的强大工具是 LangChain 和 LangGraph。在本指南中,我们将探讨如何将这些技术结合起来,构建一个能够处理复杂对话和任务的高级 AI 助手。
注意: 如果您对 LangGraph 的基础知识不熟悉,请从这篇文章开始:LangGraph 介绍:初学者指南 .
开始使用
在我们深入之前,请确保您已安装必要的包并设置了 Groq LLM,该工具是免费的。说明可以在 这里 找到。Groq 在工具调用方面表现良好,而 Llama 3 在测试此功能时提供了良好的结果。
LangChain 和 LangGraph 是什么?
- LangChain:一个用于开发语言模型驱动应用程序的框架,提供增强语言模型能力和易用性的工具。
- LangGraph:一个用于构建有状态的多参与者应用程序的库,基于 LangChain,使得创建复杂的工作流和决策树成为可能,以支持 AI 驱动的系统。
关键概念:工具调用
工具调用是代理设计中的一个突出特性,允许LLM通过@tool装饰器与外部系统交互或执行特定任务。这增加了显著的灵活性,使语言模型更具代理性和能力。
重要要求:
- 函数类型:必须为
(str) -> str 类型,接受一个字符串作为输入并返回一个字符串。
- 文档字符串:每个工具函数必须包含一个文档字符串,描述其目的。
示例工具定义:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| @tool def fetch_stock_price(symbol: str): """Fetch the current stock price for a given symbol.""" price = round(random.uniform(1, 1000), 2) return f"The current price of {symbol} is ${price:.2f}" @tool def get_current_weather(location: str): """Get the current weather for a given location.""" weather_conditions = ["Clear", "Partly Cloudy", "Cloudy", "Light Rain", "Heavy Rain", "Thunderstorm", "Snow", "Fog"] temperature = random.randint(-10, 40) condition = random.choice(weather_conditions) humidity = random.randint(30, 90) wind_speed = random.randint(0, 30) return f"Current weather in {location}:\n" \ f"- Condition: {condition}\n" \ f"- Temperature: {temperature}°C\n" \ f"- Humidity: {humidity}%\n" \ f"- Wind Speed: {wind_speed} km/h"
|
这些工具可以无缝集成到人工智能的决策过程中,使其能够根据用户请求获取实时数据或执行操作。
构建 AI 助手
我们系统的核心是 Assistant 类,它封装了 AI 的行为,使其能够轻松集成到更复杂的系统中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class Assistant: def __init__(self, runnable: Runnable): self.runnable = runnable def __call__(self, state, config: RunnableConfig): while True: configuration = config.get("configurable", {}) user_id = configuration.get("user_id", None) state = {**state, "user_info": user_id} result = self.runnable.invoke(state) if not result.tool_calls and ( not result.content or isinstance(result.content, list) and not result.content[0].get("text") ): messages = state["messages"] + [("user", "请给出真实的输出。")] state = {**state, "messages": messages} else: break return {"messages": result}
|
这个类的功能:
- 处理对话状态:AI可以接受当前状态和用户输入。
- 生成响应或调用工具:根据输入,它决定是生成响应还是使用工具。
- 处理空响应:如果模型返回空响应,它会提示生成有意义的输出。
使用 LangGraph 创建动态对话流程
LangGraph 允许我们通过图结构定义动态对话流程:
1 2 3 4 5 6 7 8
| def build_graph(): builder = StateGraph(State) builder.add_node("assistant", Assistant(assistant_runnable)) builder.add_node("tools", create_tool_node_with_fallback(tools_to_use)) builder.add_edge(START, "assistant") builder.add_conditional_edges("assistant", tools_condition) builder.add_edge("tools", "assistant") return builder
|
工作原理:
- 从助手开始:对话从助手生成响应或确定工具需求开始。
- 过渡到工具:如果需要使用工具,流程将转到工具节点。
- 返回助手:一旦工具完成其任务,控制权返回助手,允许对话继续。
整合所有内容
现在,让我们创建我们的图并开始对话:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| if __name__ == "__main__": builder = build_graph() memory = MemorySaver() graph = builder.compile(checkpointer=memory) thread_id = str(uuid.uuid4()) config = { "configurable": { "user_id": "cplog", "thread_id": thread_id, } } _printed = set() events = graph.stream( {"messages": ("user", 'what can you do?')}, config, stream_mode="values" ) for event in events: _print_event(event, _printed)
|
这段代码设置了图,启动了对话,并处理事件,打印结果。
代理设计的灵活性
虽然这里展示的 Assistant 类是一种方法,但工具调用和 LangGraph 的灵活性允许多种设计。根据您的需求,您可能会:
- 在助手中实现复杂的决策制定。
- 为各个领域添加工具。
- 创建多步骤推理过程。
- 纳入记忆或上下文管理系统。
结论
通过 LangChain 和 LangGraph,您可以构建一个强大且灵活的 AI 助手,能够处理复杂的任务和对话。工具调用显著增强了 AI 的能力,使其能够与外部系统进行交互。该系统易于扩展,是高级 AI 应用的优秀起点。
请记住,这个示例只是设计 AI 代理的一种方式。这种方法的真正优势在于其适应性——可以根据您的应用程序的具体需求进行定制。
祝您编码愉快,享受与 LangChain 和 LangGraph 一起探索 AI 开发的激动人心的世界!
作为参考,完整的教程脚本可以在这里找到:agent_tool_langgraph.py
构建代理的方法参考自 客户支持机器人教程 。如需更高级的结构,请考虑阅读完整教程。