使用 LangChain 和 LangGraph 构建工具调用对话式 AI初学者指南

使用 LangChain 和 LangGraph 构建工具调用对话式 AI初学者指南

Barry Lv6

人工智能的世界正在迅速发展,使得创建对话式 AI 系统比以往任何时候都更加容易。两种正在革新这一领域的强大工具是 LangChainLangGraph。在本指南中,我们将探讨如何将这些技术结合起来,构建一个能够处理复杂对话和任务的高级 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)
# 如果 LLM 返回空响应,则重新提示
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}

这个类的功能:

  1. 处理对话状态:AI可以接受当前状态和用户输入。
  2. 生成响应或调用工具:根据输入,它决定是生成响应还是使用工具。
  3. 处理空响应:如果模型返回空响应,它会提示生成有意义的输出。

使用 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. 返回助手:一旦工具完成其任务,控制权返回助手,允许对话继续。

整合所有内容

现在,让我们创建我们的图并开始对话:

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

构建代理的方法参考自 客户支持机器人教程 。如需更高级的结构,请考虑阅读完整教程。

  • 标题: 使用 LangChain 和 LangGraph 构建工具调用对话式 AI初学者指南
  • 作者: Barry
  • 创建于 : 2024-08-14 00:03:34
  • 更新于 : 2024-08-31 06:59:45
  • 链接: https://wx.role.fun/2024/08/14/483d81349e4f4c4792e6048c88000aaf/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。