第一课:认识 LangChain 的"核心三剑客"
如果把开发 AI 应用比作**"开一家餐厅"**:
- 大模型(LLM,如 GPT-4, 文心一言) 是你的**"顶级大厨"**,他很聪明但只懂做菜。
- LangChain 则是整个**"餐厅的管理系统"**,它负责帮大厨拿菜谱、准备食材、记下客人的口味,甚至给大厨配帮手。
在 LangChain 最核心的日常使用中,你只需要掌握这三个概念(三剑客):
- Model (模型):连接各种大模型(大厨)。
- Prompt (提示词模板):动态生成给大厨的指令(标准化的菜谱)。
- Output Parser (输出解析器):把大厨做好的菜,装在特定的盘子里端给客人(将大模型输出的文本转化为程序能看懂的格式,比如 JSON 或列表)。
现在,最流行的 LangChain 写法叫做 LCEL (LangChain 表达式语言) ,它就像流水线一样,把这三剑客串起来:Prompt | Model | Output Parser。
动手实操:写你的第一段 LangChain 代码
假设你已经安装了 Python 环境,并且可以通过 pip install langchain langchain-openai 安装了必要的库。这里我们以 OpenAI 的模型为例,如果你用的是国内大模型(如智谱、通义千问),用法也是完全一样的。
案例 1:只用大厨(Model)------ 最基础的对话
我们先简单地和模型打个招呼。
from langchain_core.prompts import ChatPromptTemplate
# 1. 制定菜谱 (提示词模板)
# {product} 是一个占位符,就像填字游戏一样
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个资深的品牌营销专家,擅长给公司起好听、有科技感的名字。"),
("user", "我的公司主要做 {product} 业务,请给我推荐3个好名字,并简单说明理由。")
])
# 2. 看看填入变量后,菜谱变成了什么样?
formatted_prompt = prompt.format_messages(product="AI扫地机器人")
print("组装好的提示词:", formatted_prompt)
案例 3:流水线组装(LCEL)------ 见证奇迹的时刻
现在,我们把 Prompt (菜谱) 、Model (大厨) 和 Output Parser (装盘) 用一条流水线(管道符 |)连起来!
from langchain_core.output_parsers import StrOutputParser
# 1. 准备三大件
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个资深的品牌营销专家。"),
("user", "我的公司主要做 {product} 业务,请给我推荐3个好名字。")
])
llm = ChatOpenAI(model="gpt-3.5-turbo")
output_parser = StrOutputParser() # 作用:把模型返回的复杂对象,提取出纯文本字符串
# 2. 组装流水线 (这就是 LCEL 的魅力,非常优雅直观!)
chain = prompt | llm | output_parser
# 3. 运行流水线
result = chain.invoke({"product": "宠物智能喂食器"})
print(result)
问题 1:为什么案例 2 的输出看起来这么奇怪?
你原本可能以为,组装好之后,打印出来的应该是一段纯文本,比如: "你是一个资深的品牌营销专家...我的公司主要做AI扫地机器人业务..."
但实际上,你看到的是一堆 [SystemMessage(...), HumanMessage(...)] 这样的东西。
原因在于:现在的大语言模型(比如 ChatGPT, Kimi)都是"聊天模型"。 聊天模型不接受"一大坨纯文本",它们要求输入的数据必须是**"带有角色的对话列表"**。
- SystemMessage(系统消息):用来设定大模型的人设(你是谁、你的规则是什么)。
- HumanMessage(人类消息):代表用户发出的具体问题。
所以,案例 2 其实是 LangChain 在帮你做数据转换 。它把你填写的 {product} 替换进去后,并没有生成一堆废话,而是非常严谨地打包成了大厨(模型)唯一能看懂的标准格式(菜单)。
问题 2:案例 2 和 案例 3 是如何串联的?
案例 2 只是为了向你演示(拆解) :提示词内部到底生成了什么东西。 在真正的开发中(也就是案例 3),我们根本不需要自己去调用 format_messages 打印这些奇怪的东西。
我们用一条流水线(|)把它们连起来,数据会在后台自动流转。 让我们看看 chain = prompt | llm | output_parser 这条流水线的内部发生了什么:
-
第一站:Prompt(菜单准备区) 当你输入
{"product": "宠物智能喂食器"}时。 Prompt 会自动生成你在案例 2 看到的那串奇怪的列表[SystemMessage(...), HumanMessage(...)]。 (这个奇怪的列表,顺着管道|直接流向了第二站) -
第二站:LLM(大厨炒菜区) 大厨(模型)完美地看懂了这串带有角色标记的列表,然后开始"炒菜"。 大厨炒完菜,输出的也不是纯文本!而是一个叫
AIMessage的奇怪对象(里面包含了生成的文本,以及消耗的 token 数量等附加信息)。 (这个AIMessage对象,顺着管道|继续流向第三站) -
第三站:Output Parser(装盘打包区) 这是最关键的一步!如果没有这一步,你打印出来的结果又会是一大串带括号的代码。
StrOutputParser()的作用就是:把大厨吐出来的复杂的AIMessage拆开,只把里面最干净的纯文本(生成的名字和理由)提取出来,返回给你。
总结
今天我们学习了 LangChain 的底层逻辑: 你不再是直接和 LLM 对话,而是通过 Prompt 构建业务逻辑 -> 交给 Model 去处理 -> 通过 Output Parser 提取想要的结果。
有了这个流水线 (chain),你就把一个大语言模型封装成了一个**"具体的软件功能"**。