系列目标:30 天从 LangChain 入门到企业级部署
今日任务:理解 Chain 的作用 → 掌握LLMChain基础用法 → 构建可复用的 AI 功能模块!
🔗 一、什么是 Chain?为什么需要它?
在 Day 2–3 中,我们这样调用模型:
prompt = ChatPromptTemplate.from_template("...")
response = llm.invoke(prompt.format(...))
这虽然能跑通,但存在几个问题:
- 重复代码多:每次都要拼 prompt + 调用 llm
- 难以复用:换个任务就要重写一遍
- 不易测试:逻辑散落在各处
Chain 就是 LangChain 的“函数封装” —— 它把 输入 → Prompt → LLM → 输出 整个流程打包成一个可调用对象,像函数一样使用!
✅ 今天主角:
LLMChain(LangChain 最经典的 Chain 类型)
🧱 二、LLMChain 基础用法(三步走)
步骤 1:准备 LLM(本地或云端)
from langchain_ollama import ChatOllama
llm = ChatOllama(model="qwen:7b", temperature=0)
步骤 2:定义 PromptTemplate
from langchain_core.prompts import PromptTemplate
template = """
你是一个翻译助手,请将以下英文句子翻译成中文:
英文:{text}
中文:
"""
prompt = PromptTemplate.from_template(template)
💡 注意:这里用
PromptTemplate(非 Chat 版),因为LLMChain传统上配合普通 LLM 使用。
如果你用的是ChatModel(如ChatOllama),推荐直接用 LCEL 表达式(见下文“现代写法”)。
步骤 3:创建并调用 LLMChain
from langchain.chains import LLMChain
chain = LLMChain(llm=llm, prompt=prompt)
result = chain.invoke({"text": "Hello, how are you?"})
print(result["text"]) # 输出:你好,你怎么样?
⚠️ 注意:
LLMChain返回的是字典,键为"text"(由 prompt 决定)。
🆕 三、更推荐的现代写法:LCEL(LangChain Expression Language)
从 LangChain 0.1 开始,官方大力推荐 LCEL 链式表达式(更简洁、更强大):
# 不需要 LLMChain!直接用管道符 |
chain = prompt | llm
response = chain.invoke({"text": "Artificial Intelligence is amazing!"})
print(response.content)
✅ 优势:
- 代码更短
- 支持流式、异步、批处理
- 更容易组合多个步骤(如
prompt | llm | parser)
📌 结论:新项目建议优先使用 LCEL(
|运算符),但理解LLMChain有助于阅读旧代码。
🛠️ 四、实战:构建一个“产品描述生成器”
用户输入产品关键词,AI 生成一段营销文案。
# day4_llmchain_demo.py
from langchain_ollama import ChatOllama
from langchain_core.prompts import ChatPromptTemplate
# 1. 初始化模型
llm = ChatOllama(model="qwen:7b", temperature=0.7)
# 2. 定义 ChatPromptTemplate(更自然)
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个电商文案专家,擅长用吸引人的方式描述产品。"),
("human", "请为以下产品生成一段 50 字以内的营销文案:{product}")
])
# 3. 构建 Chain(LCEL 方式)
chain = prompt | llm
# 4. 调用
result = chain.invoke({"product": "无线降噪耳机"})
print(result.content)
▶️ 输出示例:
沉浸静谧世界!这款无线降噪耳机,高清音质+持久续航,通勤必备!
🔁 五、如何让 Chain 支持多输入?
比如同时传入 product 和 tone(语气):
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个文案专家。"),
("human", "用{tone}的语气,为{product}写一段营销文案。")
])
chain = prompt | llm
result = chain.invoke({
"product": "智能手表",
"tone": "幽默风趣"
})
print(result.content)
✅ 只要在模板中使用
{xxx},invoke()传入同名键即可!
🔄 六、兼容 OpenAI?只需改一行!
# from langchain_openai import ChatOpenAI
# llm = ChatOpenAI(model="gpt-3.5-turbo")
from langchain_ollama import ChatOllama
llm = ChatOllama(model="qwen:7b")
🎯 同一套 Chain 逻辑,无缝切换模型后端!
⚠️ 七、常见问题 & 注意事项
| 问题 | 解决方案 |
|---|---|
LLMChain 报错 not a valid LLM | 确保传入的是 BaseLLM 或 BaseChatModel 实例 |
| 输出包含多余解释 | 在 system prompt 中强调“只返回文案,不要其他内容” |
| 中文输出乱码 | 使用 Qwen、GLM 等中文优化模型 |
| 想要 JSON 输出? | 结合 PydanticOutputParser(Day 6 讲) |
💡 最佳实践:
- 新项目用
prompt | llm(LCEL)- 旧项目维护时理解
LLMChain- 所有 Chain 都应单元测试!
📦 八、配套代码结构
langchain-30-days/
└── day4/
├── basic_llmchain.py # 传统 LLMChain 写法
├── modern_lcel.py # 推荐的 LCEL 写法(主推)
└── product_copywriter.py # 产品文案生成器实战
📝 九、今日小结
- ✅ 理解了 Chain 的作用:封装 AI 工作流
- ✅ 学会了
LLMChain基础用法(兼容旧代码) - ✅ 掌握了更现代的 LCEL 链式表达式(
prompt | llm) - ✅ 实现了可复用的“产品文案生成器”
- ✅ 支持多变量输入,模型切换无痛