前言
当笔者将本文的题目 丢给某AI时,某AI的回答是:使用LangGraph的核心意义在于,它将AI应用从线性的、不可控的"链",升级为有状态的、可精确控制的"图",让你能够构建真正能处理复杂任务的智能体(Agent)。
本文我们尝试将上述的回答 具象化。
举个栗子
如果我们需要得到两数相除的结果,可以直接让 langchain 调用大模型,得到的结果如下:
但如果我们在某些特殊场景下,就需要让结果只保留 小数点后两位。即我们需要前言中所提及的“可精确控制”。
我们直接先看基于langgraph实现这件小事 的代码示例:
from langchain_core.tools import tool from langgraph.prebuilt import create_react_agent # Define tools @tool def multiply(a: int, b: int) -> int: """Multiply two integers together.""" return a * b @tool def divide(a: int, b: int) -> float: """Divide two integers and return the result with two decimal places.""" return round(a / b, 2) tools = [multiply, divide] agent = create_react_agent(model, tools) queries = [ "What is 456 divided by 123?", "What is 123 multiplied by 456?", ] for q in queries: print(f"\nQ: {q}") result = agent.invoke({"messages": [("user", q)]}) final_msg = result["messages"][-1] print(f"A: {final_msg.content}") ####### 运行结果 ####### # Q: What is 456 divided by 123? # A: 456 divided by 123 is **3.71** (rounded to two decimal places). # Q: What is 123 multiplied by 456? # A: The result of 123 multiplied by 456 is **56,088**.如上面的代码所示,我们可以将“只返回小数点后两位” 这个能力,写进一个“tool方法”。由让大模型自主决策后,进行方法调用,以保证可精确控制。
再举个栗子
对“只返回小数点后两位”这事,可能有的朋友会说:“根本不用使用langgraph这么麻烦,直接修改提示词就完事了”。如下:
result = chain.invoke({"input": "456除以123等于多少,结果保留小数点后2位。"})有道理,我们换个例子,如:基于医学知识图谱返回医学咨询结果。
一般情况下,知识图谱的实现是由图数据库承载的。所以在相关项目的实现中,很重要的一步做好“text2sql”,大概流程图如下:
在这种极度需要精确控制的场景下,使用langgraph这种开发模式就显得比较有用了。
@tool def get_medical_consultation(question: str) -> str: """Get medical consultation based on the question.""" # text2sql # query graph database # return medical consultation实际项目中 我们还可以基于langgraph路由控制能力,在“基于医学知识图谱返回医学咨询结果”节的前后,动态增加“人工审核”、“转人工”等节点。