- LangChain 是地基。它定义了最基础的组件:什么是 Model,什么是 Prompt,什么是 Memory,什么是 Tool。
- CrewAI 和 AutoGen 在底层大量复用了 LangChain 的概念(尤其是 CrewAI,它直接依赖 LangChain 的组件)。
- 学习策略:只要懂了 LangChain 的核心概念(Chain, Agent, Tool),看 CrewAI 的代码就像看“封装好的高级脚本”,非常容易上手。
- LangGraph 是关键进化:它是 LangChain 团队为了解决复杂 Agent 流程控制而推出的新核心库,代表了从“链式(Chain)”到“图式(Graph)”的思维转变。
基础概念
- 模型(Models):LLM的“大脑”
模型是LangChain的核心动力,负责理解文本、生成内容。LangChain支持几乎所有主流LLM(比如OpenAI、GPT-4、LLaMA、Claude等),并统一了调用接口。
两种核心模型类型:
LLM:输入文本,输出文本(比如GPT-3.5的text-davinci-003)。
ChatModel:输入“消息列表”(比如用户消息、系统提示),输出“消息”(更适合对话场景,比如GPT-4的gpt-4)。
作用:负责核心的“思考”和“生成”工作,是整个应用的“智能来源”。
- 提示(Prompts):给模型的“指令”
提示词是告诉模型“该做什么”的指令。LangChain的PromptTemplate能帮你动态生成提示词,避免手动拼接字符串的麻烦。
示例:
如果你想让模型生成“给产品起名字”,可以定义一个模板:
PromptTemplate(input_variables=[“product”], template=”给一个{product}起3个有科技感的名字”)
当传入product=”智能手表”时,自动生成提示词:“给一个智能手表起3个有科技感的名字”。
作用:精准控制模型的输出,让模型按你的需求工作(比如摘要、翻译、问答等)。
- 链(Chains):组件的“连接器”
单个模型+提示只能完成简单任务(比如生成一句话),但复杂任务需要多步操作(比如先翻译再总结)。链就是把多个组件(模型、提示、其他链)按顺序组合起来的工具。
常见链类型:
LLMChain:最基础的链,由“提示模板”+“模型”组成,直接输出结果。
SequentialChain:按顺序执行多个链(比如链1的输出作为链2的输入)。
RouterChain:根据输入内容“选择”不同的链执行(比如判断问题类型,再调用对应链)。
示例:用SequentialChain实现“先翻译英文到中文,再总结中文内容”:
链1(翻译)→ 链2(总结),输入英文,输出总结后的中文。
- 记忆(Memory):让模型“记住”历史
默认情况下,LLM是“健忘的”——每次调用都是独立的,不知道之前的对话。记忆组件的作用是保存对话历史,并把历史内容“喂”给模型,让对话有连贯性。
常见记忆类型:
ConversationBufferMemory:简单保存所有对话历史(适合短对话)。
ConversationSummaryMemory:自动总结对话历史(适合长对话,避免内容过长)。
ConversationTokenBufferMemory:按“Token数量”保存历史(防止超过模型输入限制)。
示例:聊天机器人中,用ConversationBufferMemory保存“用户问了什么”和“AI答了什么”,每次新对话时,把历史内容和新问题一起传给模型,模型就知道上下文了。
- 工具(Tools):模型的“外挂能力”
LLM的知识截止到训练数据(比如GPT-4截止到2023年10月),也不会实时计算、查天气。工具是模型可以调用的外部能力,帮模型弥补这些缺陷。
常见工具类型:
搜索引擎(比如Google Search,查实时信息);
计算器(比如llm-math,做精确计算);
数据库(比如SQL工具,查数据库数据);
自定义函数(比如你自己写的“查天气”API)。
作用:让模型从“只能凭记忆回答”变成“能主动调用工具获取信息”。
- 代理(Agents):工具的“决策者”
有了工具,谁来决定“什么时候用什么工具”?——代理。
代理是一个“决策者”:它会分析用户的问题,判断是否需要调用工具(如果需要,调用哪个工具),并根据工具返回的结果生成最终答案。
常见代理类型:
Zero-shot React Description:根据工具的“描述”直接决定调用(适合简单场景);
Conversational React Description:带记忆的代理(适合对话场景,能结合历史决定调用);
Structured Input:处理结构化输入(比如表格数据)的代理。
示例:用户问“今天北京的气温是多少?”
代理分析:“这个问题需要实时数据,模型不知道,所以调用天气工具”→ 调用工具获取气温→ 整理结果回答用户。