创建代理系统时,如果能自动完美返回结果就好了,但以目前的精度来说很难。如果你让Agent思考整个过程,哪怕一个错误都会导致结果与你想要的大相径庭。
而且有些操作太可怕了,无法将权限完全委托给代理。有 API 调用、DB 修改、Bash 脚本编写等
所以现在(也许相当长一段时间),代理执行过程中的人为干预是不可避免的
。支持5种人为干扰的情况。
决定是否继续与人类一起进行。
向用户显示当前状态并允许修改。
指定接收用户输入并实际从用户处接收值的步骤。
允许用户查看和修改工具的结果值。
返回到之前的状态(节点执行之前)或者返回并再次继续。就像多元宇宙一样。
由于 Langgraph 的持久层,这种人为干预成为可能。可以保存需要人工干预的状态,并在用户批准或修改后从该点重新开始。这就像游戏中的检查站。
就像在调试工具中设置断点一样,断点表示仅前进到该点并暂停一会儿。
在langgraph中,编译图时可以指定断点。
graph = builder.compile(checkpointer=checkpointer, interrupt_before=["step_for_human_in_the_loop"])
编译时的声明是静态的。根据执行过程中状态的变化很难停止。动态断点是可以根据状态设置的断点。当发生称为 NodeInterrupt 的特殊异常时,图形执行将停止并等待用户干预。
def my_node(state: State) -> State: if len(state['input']) > 5: raise NodeInterrupt(f"Received input that is longer than 5 characters: {state['input']}") return state
看图就更容易了。
# Compile our graph with a checkpoitner and a breakpoint before the step to approve graph = builder.compile(checkpointer=checkpoitner, interrupt_before=["node_2"]) # Run the graph up to the breakpoint for event in graph.stream(inputs, thread, stream_mode="values"): print(event) # ... Get human approval ... # If approved, continue the graph execution from the last saved checkpoint for event in graph.stream(None, thread, stream_mode="values"): print(event)
graph执行在node_2之前完成,所以第一个for语句被转义,然后再次调用graph.stream继续执行。
graph = builder.compile(checkpointer=checkpointer, interrupt_before=["step_for_human_in_the_loop"])
它也停在node_2前面,这一次,它没有执行任何操作并再次调用graph.stream,而是更改了当前图的状态。之后,图形会在更改后的状态下再次执行。
其他操作请查看下面Langgraph官方文档
https://langchain-ai.github.io/langgraph/concepts/ human_in_the_loop/
以上是Langgraph - 人在循环中的详细内容。更多信息请关注PHP中文网其他相关文章!