CrabNote螃蟹笔记

开发:探索LangGraph:如何创建一个既智能又可控的航空客服AI

开发:探索LangGraph:如何创建一个既智能又可控的航空客服AI

开发:探索LangGraph:如何创建一个既智能又可控的航空客服AI 开发:探索LangGraph:如何创建一个既智能又可控的航空客服AI 图的定义 现在,创建图。我们的图与第二部分几乎相同,只是我们将工具分为了两个不同的节点。我们只在实际更改用户预订的工具之前进行中断。 Code block SQL from typing import Literal from langgraph.checkpoint.sqlite import SqliteSaver from langgraph.graph import END, StateGraph from langgraph.prebuilt import tools condition builder = StateGraph(State) def user info(state: State): return {"user info": fetch user flight information.invoke({})} 新增:fetch user info节点首先运行,这意味着我们的助手可以在 不需要采取行动的情况下看到用户的航班信息 builder.add node("fetch user info", user info) builder.set entry point("fetch user info") builder.add node("assistant", Assistant(part 3 assistant runnable)) builder.add node("safe tools", create tool node with fallback(part 3 safe tools)) builder.add node( "sensitive tools", create tool node with fallback(part 3 sensitive tools) ) 定义逻辑 builder.add edge("fetch user info", "assistant") def route tools(state: State) Literal["safe tools", "sensitive tools", " end "]: next node = tools condition(state) 如果没有调用工具,返回用户 if next node == END: return END ai message = state["messages"][ 1] 这假设是单个工具调用。要处理并行工具调用,你将想要 使用ANY条件 first tool call = ai message.tool calls[0] if first tool call["name"] in sensitive tool names: return "sensitive tools" return "safe tools" builder.add conditional edges( "assistant", route tools, ) builder.add edge("safe tools", "assistant") builder.add edge("sensitive tools", "assistant") memory = SqliteSaver.from conn string(":memory:") part 3 graph = builder.compile( checkpointer=memory, 新增:图将在执行"tools"节点之前始终停止。 用户可以在助手继续之前批准或拒绝(甚至更改请求) interrupt before=["sensitive tools"], ) 示例对话 接下来,让我们尝试新修订的聊天机器人!我们将在以下对话列表上运行它。这次,我们将减少确认的次数。 Code block SQL import shutil import uuid 使用备份文件更新,以便我们可以从每个部分的原始位置重新启动 shutil.copy(backup file, db) thread id = str(uuid.uuid4()) config = { "configurable": { passenger id在我们的航班工具中使用 以获取用户的航班信息 "passenger id": "3442 587242", 通过thread id访问检查点 "thread id": thread id, } } tutorial questions = [ "嗨,我的航班是什么时候?", "我可以更新我的航班到更早的时间吗?我想今天晚些时候离开。", "那就更新到下周的某个时间", "下一个可用的选项很好", "关于住宿和交通呢?", "是的,我想要一个负担得起的酒店,用于我为期一周的住宿(7天)。我还想要租一辆车。", "好的,可以为你推荐的酒店预订吗?听起来不错。", "是的,继续预订任何中等费用且有可用性的酒店。", "现在对于汽车,我的选择是什么?", "太棒了,我们只需要最便宜的选项。继续预订7天", "好的,现在你对旅行有什么建议?", "在我在那里的时候,它们可用吗?", "有趣 我喜欢博物馆,有什么选择?", "好的,选一个并在我到达的第二天为我预订。", ] printed = set() 我们可以重用第一部分的教程问题,看看它的表现如何。 for question in tutorial questions: events = part 3 graph.stream( {"messages": ("user", question)}, config, stream mode="values" ) for event in events: print event(event, printed) snapshot = part 3 graph.get state(config) while snapshot.next: 我们有中断!代理试图使用工具,用户可以批准或拒绝它 注意:此代码都在图之外。通常,你会将输出流到UI。 然后,当用户提供输入时,你会通过API调用触发新的运行。 user input = input( "你是否批准上述操作?输入'y'继续;" " 否则,请说明你请求的更改。\n\n" ) if user input.strip() == "y": 只是继续 result = part 3 graph.invoke( None, config, ) else: 通过提供有关请求更改/改变主意的说明 满足工具调用 result = part 3 graph.invoke( { "messages": [ ToolMessage( tool call id=event["messages"][ 1].tool calls[0]["id"], content=f"API调用被用户拒绝。理由:'{user input}'。继续协助,考虑用户的输入。", ) ] }, config, ) snapshot = part 3 graph.get state(config) 第三部分回顾 现在,我们的聊天机器人工作得很好,你可以通过LangSmith跟踪来检查它的最新运行情况。这个设计可能已经满足了你的需求。代码是封闭的,并且它的行为符合预期。 然而,这个设计的一个潜在问题是,它对单个提示施加了很大压力。如果我们想要添加更多工具,或者每个工具变得更加复杂,那么机器人使用工具的效率和整体行为可能会受到影响。 在下一节中,我们将展示如何通过根据用户的意图将用户引导至专业代理或子图,来更精确地控制不同的用户体验。 图的定义 现在,创建图。我们的图与第二部分几乎相同,只是我们将工具分为了两个不同的节点。我们只在实际更改用户预订的工具之前进行中断。 示例对话 接下来,让我们尝试新修订的聊天机器人!我们将在以下对话列表上运行它。这次,我们将减少确认的次数。 第三部分回顾 现在,我们的聊天机器人工作得很好,你可以通过LangSmith跟踪来检查它的最新运行情况。这个设计可能已经满足了你的需求。代码是封闭的,并且它的行为符合预期。 然而,这个设计的一个潜在问题是,它对单个提示施加了很大压力。如果我们想要添加更多工具,或者每个工具变得更加复杂,那么机器人使用工具的效率和整体行为可能会受到影响。 在下一节中,我们将展示如何通过根据用户的意图将用户引导至专业代理或子图,来更精确地控制不同的用户体验。 🍞 AI小智 2024 05 22 17:30 湖北 原文地址:https://mp.weixin.qq.com/s/TZe7os5ISo6sH4WOyMXLnw AI小智 2024 05 22 17:30 湖北 原文地址:https://mp.weixin.qq.com/s/TZe7os5ISo6sH4WOyMXLnw 上节课,我们将利用LangGraph的interrupt before功能,在执行任何工具之前,暂停流程并把控制权交还给用户。没看过的同学可以点击链接LangGraph实战:可控的AI航空客服助手查阅。在本章节中,我们通过将工具分为只读(安全)和修改数据(敏感)两类,来优化我们的中断机制。我们仅对敏感工具实施中断,使得机器人能够自主处理一些简单的查询。 LangGraph实战:可控的AI航空客服助手 上节课,我们将利用LangGraph的interrupt before功能,在执行任何工具之前,暂停流程并把控制权交还给用户。没看过的同学可以点击链接LangGraph实战:可控的AI航空客服助手查阅。在本章节中,我们通过将工具分为只读(安全)和修改数据(敏感)两类,来优化我们的中断机制。我们仅对敏感工具实施中断,使得机器人能够自主处理一些简单的查询。 LangGraph实战:可控的AI航空客服助手 这种设计既保持了用户控制权,又确保了对话流程的顺畅。但随着工具数量的增加,单一的图结构可能会变得过于复杂。我们将在下一节中解决这个问题。 第三部分的图将类似于下面的示意图: 第三部分示意图 状态定义 首先,定义图的状态。我们的状态和LLM调用与第二部分相同。