从LangChain和LangGraph看透Agent智能体的真相

50 阅读11分钟

本文较长,建议点赞收藏。更多AI大模型应用开发学习视频及资料,在智泊AI

最近随着大模型开始火爆,只要你一打开手机,不管是懂技术的还是不懂技术的,所有人都在聊同一个词——Agent(智能体)

老板在会上问你:“咱们的业务能不能加个 Agent?” 投资人在咖啡厅里聊:“大模型只是工具,落地还得看 Agent。” 甚至连卖课的都在喊:“错过 Agent,你就错过了 AI 时代的最后一张船票!”

还有各种层出不穷的智能体产品更是让人眼花缭乱。结果是,这个要买会员,那个要充值,再要不就是免费的都降智。反正智能体玩没玩明白不知道,但花在AI大模型的钱先算不明白了。

朋友们,不知道你们有没有想过:这个被吹上天的 Agent,到底是个什么东西?

是给 ChatGPT 穿了个马甲?还是真有什么黑科技? 很多人其实是懵的。大家都在人云亦云,觉得这玩意儿是个神秘的黑盒,好像把大模型往里一扔,它就能自己写代码、自己赚钱了。

今天这条视频,我就带你来扒一扒Agent的老底。不过与其在外面听那些概念炒作,不如咱们直接钻到发动机舱里,看看它是怎么造出来的。

要想看透 Agent 的本质,有两个最好的参考工具:LangChain 和 LangGraph。 这俩是目前全球最主流的 AI 开发框架。搞懂了它们,你再看市面上那些五花八门的智能体,CodeBuddy啊,灵光啊什么的,在你眼里就全是透明的了。

如果你不想做 AI 时代的“韭菜”,想做那个看透本质的人,这条视频,一定要看到最后。

LangChain — 当大模型只是“流水线工人”

首先,我们得聊聊 LangChain。 在 Agent 这个概念还没彻底火起来之前,LangChain 其实已经统治了 AI 开发圈。

它的核心概念,就在这个 Chain(链)  字上。 

什么叫 Chain?大家想象一下工厂的流水线。 原料进来,第一道工序清洗,第二道工序加工,第三道工序包装。

在 LangChain 的早期架构里,大语言模型(LLM)扮演的是什么角色呢? 它只是这条流水线上的一个工人,或者说一道工序

举个例子,一个最简单的智能体工具工作流程是这样的:

    1. 第一步:收集你提过来的提示词,做一些整理和补充,把他整理成明确,通顺的问题0。
    1. 第二步:把整理好的问题再扔给LLM大语言模型,让他给出答复。
    1. 第三步:LLM大语言模型给出的答复信息比较多,整理整理,把最关心的内容整理出来,再返回给你。

这样一个典型的流程,用LangChain框架去实现,大概就是这样:

from langchain_core.prompts import ChatPromptTemplate  
from langchain_openai import ChatOpenAI  
from config.load_key import load_key  
from langchain_core.output_parsers import StrOutputParser  
  
# 提示词模板  
prompt_template = ChatPromptTemplate.from_messages([  
    ("user""{text}")  
])  
# 构建阿里云百炼大模型客户端  
llm = ChatOpenAI(  
    model="qwen-plus",  
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",  
    openai_api_key=load_key("BAILIAN_API_KEY"),  
)  
# 结果解析器 StrOutputParser会AIMessage转换成为str,实际上就是获取AIMessage的content属性。  
parser = StrOutputParser()  
# 构建链  
chain = prompt_template | llm | parser  
  
chain.invoke({"text":"你是谁"})  
  
//答案:'我是通义千问,由阿里云研发的超大规模语言模型。我能够回答问题、创作文字,如写故事、公文、邮件、剧本等,还能进行逻辑推理、编程,甚至表达观点和玩游戏。我支持多种语言,包括中文、英文、德语、法语、西班牙语等。如果你有任何问题或需要帮助,欢迎随时告诉我!'

这个Chain链条就是完整的处理逻辑,如果你还需要构建更复杂的业务流程,比如大模型第一次回答的答案,你还要再次调用其他大模型,那就在这个链条后面添加更多的组件就可以了。

发现了吗?在这里,大模型虽然很聪明,但它没有话语权。 它被我们写死的代码(Chain)推着走。A 做完必须做 B,B 做完必须做 C。

这种架构的优点是稳定,但缺点太致命了——它太死板。 这就好比你雇了个天才,但你只让他拧螺丝。如果中间螺丝滑丝了(大模型出错了),这条 Chain 是不知道变通的,它只会报错。

说到这儿,大家觉得这种“一根筋”的流程能叫智能体吗?或者你有没有遇到过这样逻辑定义的智能体?可以在评论区说说你的想法。


LangGraph —赋予大模型指挥权

因为 Chain 太死板,解决不了复杂问题,所以 LangGraph 诞生了。 LangGraph 的核心,从 Chain(链)变成了 Graph(图)

但最最最关键的区别在于,LangGraph 引入了大模型最需要的一个能力:循环(Loop)+ 记忆(State)

在 LangGraph 的架构里,大模型(LLM)摇身一变,从流水线工人变成了交通指挥官

当一个任务进来,LangGraph 不会规定死下一步走哪。 它会把当前的情况(我们管它叫 State/状态)扔给大模型,问它:“老板,你看现在这情况,咱们下一步该干啥?”

大模型一看:“这步做错了,重做!”——这就是循环。 大模型一看:“这步做完了,下一步!”——这就是推进

比如这里就是一个典型的案例。

# 构建一个图。图中两个步骤:第一步让大模型推荐一个有名的作家,第二步,让大模型用推荐的作家的风格写一个100字以内的笑话。  
from typing import TypedDict  
from typing_extensions import NotRequired  
from langgraph.checkpoint.memory import InMemorySaver  
from langgraph.constants import START, END  
from langgraph.graph import StateGraph  
  
from config.load_key import load_key  
from langchain_community.chat_models import ChatTongyi  
# 构建阿里云百炼大模型客户端  
llm = ChatTongyi(  
    model="qwen-plus",  
    api_key=load_key("BAILIAN_API_KEY"),  
)  
  
class State(TypedDict):  
    author: NotRequired[str]  
    joke: NotRequired[str]  
  
def author_node(state:State):  
    prompt = "帮我推荐一位受人们欢迎的作家。只需要给出作家的名字即可。"  
    author = llm.invoke(prompt)  
    return {"author":author}  
  
def joke_node(state:State):  
    prompt = f"用作家:{state['author']} 的风格,写一个100字以内的笑话"  
    joke = llm.invoke(prompt)  
    return {"joke":joke}  
  
builder = StateGraph(State)  
builder.add_node(author_node)  
builder.add_node(joke_node)  
  
builder.add_edge(START,"author_node")  
builder.add_edge("author_node","joke_node")  
builder.add_edge("joke_node",END)  
  
checkpointer = InMemorySaver()  
graph = builder.compile(checkpointer=checkpointer)  
graph

返回结果:

先让大模型推荐一个受欢迎的作家,然后再让大模型用这个作家的风格写一个笑话。

# 正常执行一个图  
import uuid  
  
config = {  
    "configurable": {  
        "thread_id": uuid.uuid4(),  
    }  
}  
state = graph.invoke({}, config)  
  
print(state["author"])  
print()  
print(state["joke"])

返回结果:content='村上春树' additional_kwargs={} response_metadata={'model_name': 'qwen-plus', 'finish_reason': 'stop', 'request_id': 'f3f97a29-4e8b-4d6b-8cb6-05941efaee93', 'token_usage': {'input_tokens': 23, 'output_tokens': 4, 'total_tokens': 27, 'prompt_tokens_details': {'cached_tokens': 0}}} id='run-c7b0f76c-b403-4175-a7ee-a7c10151c73c-0'

content='我养的猫突然开口说话,说它其实是村上春树笔下的人物。 \n“那你该去参加文学奖。”我说。 \n它摇摇头:“太麻烦了,我还是更想喝那杯威士忌,加冰,像爵士乐一样安静地融化。” \n然后我们沉默,听着窗外的萨克斯风——其实只是邻居在锯木头。' additional_kwargs={} response_metadata={'model_name': 'qwen-plus', 'finish_reason': 'stop', 'request_id': '0c641b22-9bc6-47c3-b9a2-ff8125eb607a', 'token_usage': {'input_tokens': 166, 'output_tokens': 80, 'total_tokens': 246, 'prompt_tokens_details': {'cached_tokens': 0}}} id='run-2e158741-d294-479e-a049-dd22063636d0-0'

经过处理后,如果觉得效果不理想,比如他推荐的这个作者不喜欢,还可以回到某一个节点,修改大模型的结果,换一个作者,重新写笑话。

# 查看所有checkpoint检查点  
states = list(graph.get_state_history(config))  
# 推荐作家那一步  
selected_state = states[1# 重新设定State  
new_config = graph.update_state(selected_state.config, values={"author""郭德纲"})  
# 重新执行Graph  
graph.invoke(None,new_config)

返回结果:{'author': '郭德纲', 'joke': AIMessage(content='昨儿上街买包子,老板问:“要几个?”我说:“来俩。” \n他一愣:“就俩?不够吧?” \n我说:“够了,我胃口小。” \n老板叹口气:“不是,我这蒸笼五十个起卖……” \n我说:“那你早说啊!” \n拎起五十个包子就走。 \n回家路上饿了,边走边吃,吃到四十八个,到家剩俩。 \n媳妇问:“就买俩?” \n我说:“对,就俩。”', additional_kwargs={}, response_metadata={'model_name': 'qwen-plus', 'finish_reason': 'stop', 'request_id': 'd0f1f5ce-4764-4efb-a00a-cc5585167efe', 'token_usage': {'input_tokens': 26, 'output_tokens': 110, 'total_tokens': 136, 'prompt_tokens_details': {'cached_tokens': 0}}}, id='run-b752980d-ca0a-44de-9cad-84259496569b-0')}

从这个案例看出:

Agent = 大模型 + 循环控制流 + 记忆。  只有具备了这种“循环”和“决策”能力的架构,才配叫真正的 Agent。


三种核心模式与“积木组合”

好,理解了“图”和“循环”,接下来才是最精彩的部分。 市面上那些看似复杂的 Agent,其实都是由三种最基础的“图模式”演变来的。

第一种:反思模式(Reflection)。 这就像一个 “强迫症作家” 。 大模型写一段代码,然后自己跳到“批评家”节点,挑自己的毛病。如果有毛病,就跳回去重写。直到自己满意为止。 这就是为什么现在的 AI 写代码越来越准,因为它自己在图里跑了好几圈才给你看。

第二种:工具路由模式(Tool Routing)。  这就像一个  “全能工匠” 。 中间是大脑,周围挂着计算器、谷歌搜索、画图工具。 大脑看一眼问题:“嗯,这个需要算数。” 啪,调用计算器。算完回来发现:“哎,还需要搜个图。” 啪,调用搜索。 这是目前最通用的助理形态。

第三种:监督者模式(Supervisor Mode)。  这个最厉害,它像一个  “项目经理带着一帮小弟” 。 顶部有一个监督者大模型(Supervisor),它不干脏活累活,它只负责分包。 任务来了,监督者说:“小王(写代码的 Agent),你去写个爬虫。” 小王干完回来汇报。监督者一看:“不行,这爬虫报错了。小李(查文档的 Agent),你去查查文档怎么修。” 小李查完回来汇报。监督者再指挥小王去修。 整个过程,监督者在不断协调,直到任务搞定。

重点来了!  现在的超级智能体是怎么做出来的? 就是把这三种模式,像搭积木一样组合起来!

在一个“监督者模式”里,那个负责写代码的“小弟”,它内部可能就是一个“反思模式”的图; 那个负责查文档的“小弟”,它内部可能就是一个“工具路由模式”的图。

你把这些图嵌套在一起,就构成了那些几百美金一个月的高级 AI 员工。 从部分到整体,从简单到复杂,这就是 Agent 产品的底层逻辑。


总结

最后,总结一下。

大家不要被 Agent 这个词吓倒。 无论外面的产品包装得多么花哨,剥开外壳,它们都是由 LangGraph 这种状态机编织出来的网络。

LangChain 让我们学会了把大模型当工人用; 而 LangGraph 让我们学会了把大模型当经理用,甚至当 CEO 用。

当你理解了这三种图的模式,并且知道怎么组合它们时,你就已经比 99% 的人更懂 Agent 了。

至于 LangChain 和 LangGraph 的具体代码怎么写,那些 add_nodeadd_edge 的语法细节,短视频里讲太枯燥了。有兴趣我们再深聊。

我是楼兰,IT路上一起进步。我们下期见!

学习资源推荐

如果你想更深入地学习大模型,以下是一些非常有价值的学习资源,这些资源将帮助你从不同角度学习大模型,提升你的实践能力。

本文较长,建议点赞收藏。更多AI大模型应用开发学习视频及资料,在智泊AI