LangChain 入门:把大模型"组装"成应用的那套乐高(5分钟用通义千问 + LCEL 跑通 Demo)
目标:5 分钟跑通一个"AI 短文生成器",并在同一套 LCEL 链上,顺手加上 3 种常见扩展:流式输出(streaming)/ 结构化输出(JSON)/ 并行生成(一次出标题+摘要+标签)。
你只要有 DashScope 的 Key,就能复制即跑。
0. 你最终会得到什么?
一个最小可用的"内容生产链":
- 输入:topic(主题)
- 输出:一篇短文(Markdown)
- 扩展 1:边生成边打印(流式)
- 扩展 2:输出 JSON(便于落库/渲染)
- 扩展 3:并行一次生成:标题 / 摘要 / 标签 / 正文(更像产品)
1. 先把话说清:LangChain 到底解决啥问题?
只用大模型 API,你很快会遇到 3 类"工程问题":
- Prompt 要复用:模板化、参数化、版本管理
- 任务不是一步:总结→提炼→格式化→校验
- 模型要"接外部能力":查资料(RAG)、调接口、算数、读库、跑工作流
LangChain 的价值就是:把这些能力拆成标准零件(Prompt / Model / Parser / Retriever / Tool / Memory...),再用 LCEL(表达式语言)像搭积木一样拼起来:
prompt | model | parser
2. 核心能力一屏看懂
| 你要的能力 | LangChain 对应积木 |
|---|---|
| 统一调用不同大模型 | Chat Model / LLM 封装 |
| 可维护的提示词 | ChatPromptTemplate |
| 多步骤流水线 | Chain / LCEL |
| 知识库问答更准 | RAG:Retriever + VectorStore + Embeddings |
| 让模型会"用工具" | Agent + Tools |
| 多轮对话不断片 | Message History / Memory |
3. 5 分钟快速跑通(Baseline:短文生成)
3.1 安装
bash
pip install -U langchain langchain-core langchain-community dashscope
如果你后续要做 RAG,再装:faiss-cpu / chromadb / langchain-text-splitters 等(先别急,5分钟先跑通)。
3.2 配置环境变量(推荐)
bash
export DASHSCOPE_API_KEY="你的Key"
3.3 最小可运行代码:Prompt → Qwen → 文本输出(LCEL)
保存为 main.py:
python
from langchain_community.chat_models.tongyi import ChatTongyi
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
# 1) 模型(通义千问)
llm = ChatTongyi(
model="qwen-turbo",
temperature=0.7,
)
# 2) Prompt:system + user
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个写作助理,输出要通俗易懂,尽量给可操作建议。"),
("user",
"请围绕「{topic}」写一篇 180~220 字的中文短文,Markdown 输出。\n"
"要求:\n"
"- 先给一句话结论\n"
"- 再给 3 条要点(列表)\n"
"- 最后给 1 个落地小例子\n")
])
# 3) 解析器:把 AIMessage -> str
parser = StrOutputParser()
# 4) LCEL:拼链
chain = prompt | llm | parser
if __name__ == "__main__":
print(chain.invoke({"topic": "什么是 LangChain,以及它解决什么问题"}))
运行:
bash
python main.py
到这里,你已经完成了 "可复用 Prompt + 可替换模型 + 可组合链" 的最小闭环。
4. 立刻加 3 个"更像产品"的能力扩展
4.1 扩展 A:流式输出(边生成边打印)
把最后的 invoke 换成 stream:
python
for chunk in chain.stream({"topic": "如何用 LangChain 搭一个内容生产链"}):
print(chunk, end="", flush=True)
你会看到模型逐段输出,更适合做 CLI、Web SSE、前端打字机效果。
4.2 扩展 B:结构化输出(JSON,方便前端渲染/落库)
很多时候你不想要"散文",而是想要字段:title、summary、tags、body。
做法:让模型按 JSON 输出,然后用解析器解析。
python
import json
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
prompt_json = ChatPromptTemplate.from_messages([
("system",
"你是内容结构化助手。只输出严格 JSON(不要代码块,不要多余文字)。"),
("user",
"围绕「{topic}」生成一份内容结构,JSON schema 如下:\n"
'{'
'"title": "string", '
'"summary": "string(<=80字)", '
'"tags": ["string","string","string"], '
'"body_md": "string(Markdown, 180~220字)"'
'}\n'
"请严格按 schema 输出。")
])
chain_json = prompt_json | llm | StrOutputParser()
raw = chain_json.invoke({"topic": "LangChain 的 LCEL 是什么"})
data = json.loads(raw) # 解析成 dict
print("title:", data["title"])
print("tags:", data["tags"])
print("body:", data["body_md"])
好处:后续接数据库/埋点/AB 实验/模板渲染都更自然。
4.3 扩展 C:并行生成(一次输出标题+摘要+标签+正文)
LangChain 的 runnable 支持"并行图"(很适合内容生产、报告生成、批量要素提取)。
python
from langchain_core.runnables import RunnableParallel
title_prompt = ChatPromptTemplate.from_messages([
("system", "你是标题党克制版助手。"),
("user", "给「{topic}」生成一个不夸张但有点击的中文标题(<=18字)。")
])
summary_prompt = ChatPromptTemplate.from_messages([
("system", "你是摘要助手。"),
("user", "用不超过 80 字总结「{topic}」。")
])
tags_prompt = ChatPromptTemplate.from_messages([
("system", "你是标签助手。"),
("user", "给「{topic}」生成 3 个中文标签,用逗号分隔。")
])
body_prompt = prompt # 复用你第3节的短文 prompt
parallel = RunnableParallel({
"title": title_prompt | llm | StrOutputParser(),
"summary": summary_prompt | llm | StrOutputParser(),
"tags": tags_prompt | llm | StrOutputParser(),
"body_md": body_prompt | llm | StrOutputParser(),
})
out = parallel.invoke({"topic": "用 LangChain 5 分钟跑通 Demo"})
print(out["title"])
print(out["summary"])
print(out["tags"])
print(out["body_md"])
这一步非常"产品化":你可以直接把 out 喂给前端渲染、存草稿箱、做内容推荐特征抽取等。
5. 下一步怎么扩展 LangChain 能力(给你 3 档路线)
Baseline(你已经有了)
- PromptTemplate / ChatModel / LCEL / streaming / JSON 输出 / 并行
Pro(建议一周内补齐)
- RAG:给短文加"参考资料来源",避免胡编
- LangSmith:链路追踪、错误定位、成本统计
- 评估:同一 topic 多版本生成,A/B 选最优(或用 LLM-as-judge)
Extreme(做成可上线的小产品)
- Agent + Tools:联网检索 / 读数据库 / 调企业 API
- Memory:把用户偏好、写作风格沉淀到对话历史
- LangServe/LangGraph:服务化 + 工作流编排 + 可观测性
6. 常见坑(你跑不起来时优先看这几条)
- DASHSCOPE_API_KEY 没生效:确认终端里 echo $DASHSCOPE_API_KEY 有值
- 依赖版本冲突:直接 pip install -U langchain langchain-core langchain-community dashscope
- 输出 JSON 解析失败:让模型"只输出 JSON、不要代码块",并在 prompt 里强调"严格 JSON"