LangChain 核心组件实操
很多刚接触大模型开发的同学都会遇到三个共性麻烦:
- 换个模型就要重写一遍调用代码,来回适配接口很折腾
- 提示词每次都手写大段重复内容,改个规则要翻遍所有代码
- 模型输出的都是自然语言,想取个数据还得写正则拆分,又麻烦又容易错
LangChain 的核心组件就是专门解决这些问题的。它把大模型应用拆成了一块块标准化“积木”,学会组合这几块基础积木,就能快速搭出稳定可控的小应用。本文只讲最核心的 3 个组件,配新手友好的实操案例,看完就能动手跑通。
一、模型调用:一套代码兼容所有大模型
解决什么问题
不同厂商的大模型(OpenAI、DeepSeek、本地开源模型)接口规范都不一样,如果每次换底座都要重写业务逻辑,开发效率会非常低。
LangChain 做了一层统一封装,不管底层用哪家的模型,上层调用方式完全一致。换模型只需要改一行初始化代码,业务逻辑丝毫不动。
先搞懂两个基础概念
现在主流大模型基本都是对话模型(ChatModel),也就是接收“带角色的对话列表”,返回一条回复。另一种纯文本生成的 LLM 已经很少用了,新手重点掌握对话模型即可。
对话里的三种角色不是单纯的“身份标签”,而是有明确的约束优先级:
system:全局规则,比如“你是一个编程入门助教,说话要通俗”,全程生效,优先级最高user:用户当前的问题/指令,推动对话前进assistant:模型之前的回复,用来让模型记住上下文,不然它下一轮就“失忆”了
新手实操:5行代码跑通对话
我们用最常见的兼容 OpenAI 接口的模型做演示,全程只需要“初始化→构造消息→调用→取结果”四步。
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
import os
# 加载密钥(把密钥存在.env文件里,不要硬写在代码里)
load_dotenv()
# 1. 初始化模型:换模型只改这里的参数
llm = ChatOpenAI(
api_key=os.getenv("API_KEY"),
base_url=os.getenv("BASE_URL"),
model="deepseek-v4-flash",
temperature=0.3 # 数值越小回答越严谨,越大越有创意
)
# 2. 构造对话消息
messages = [
{"role": "system", "content": "你是编程入门助教,用大白话解释概念,不超过3句话"},
{"role": "user", "content": "什么是Python的变量?"}
]
# 3. 调用模型
result = llm.invoke(messages)
# 4. 取回复内容
print(result.content)
核心要点
- 统一的
invoke()方法是 LangChain 所有组件的通用调用方式,后面的模板、解析器也都用这个方法 - 想换成本地开源模型?只需要把初始化部分换成 HuggingFace 相关代码,后面的调用逻辑完全不变
- 多轮对话的本质:每次把新的用户问题和模型回复都追加到消息列表里,再传给模型
二、提示词模板:告别重复写提示词
解决什么问题
比如你想做一个“编程概念解释器”,每次都要把“你是助教、要用大白话、不超过3句话”这些规则重写一遍,不仅麻烦,还容易漏写规则导致输出不稳定。
提示词模板的作用就是把固定规则和动态参数拆开,模板写一次,每次只传不同的参数就行。
基础模板:参数化复用
我们把上面的例子改成模板版,把“概念名称”和“受众”做成可替换的参数:
from langchain_core.prompts import PromptTemplate
# 1. 定义模板:用{参数名}占位
prompt = PromptTemplate(
input_variables=["concept", "audience"],
template="请用{audience}能听懂的大白话,解释什么是{concept},不超过3句话。"
)
# 2. 传入参数生成完整提示词
full_prompt = prompt.format(concept="Python变量", audience="初中生")
print(full_prompt)
# 3. 传给模型调用
result = llm.invoke([{"role": "user", "content": full_prompt}])
print(result.content)
下次想解释“函数”给“小学生”听,只需要改 format() 里的参数,模板本身不用动。后续想调整回答风格,也只改模板一处,所有调用都会同步生效。
进阶模板:给示例,让输出格式更听话
光靠文字指令,模型经常输出格式乱飘。比如你想让它按固定格式生成动漫推荐,只说“按格式输出”没用,直接给它看2个示例,效果会好很多,这就是少样本提示模板。
from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate
# 1. 准备2个示例
examples = [
{"name": "千与千寻", "recommend": "治愈系动画天花板,适合全年龄段观看"},
{"name": "灵能百分百", "recommend": "热血又温柔的反套路番,适合喜欢成长向的观众"}
]
# 2. 定义每个示例的展示格式
example_prompt = PromptTemplate(
input_variables=["name", "recommend"],
template="动漫:{name}\n推荐语:{recommend}"
)
# 3. 组装少样本模板
few_shot_prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=example_prompt,
suffix="动漫:{new_name}\n推荐语:",
input_variables=["new_name"]
)
# 生成提示词并调用
full_prompt = few_shot_prompt.format(new_name="进击的巨人")
result = llm.invoke([{"role": "user", "content": full_prompt}])
print(result.content)
核心要点
- 基础模板解决“重复写提示词”的问题,适合参数化的简单需求
- 少样本模板解决“输出格式不稳定”的问题,凡是需要固定结构的输出都可以用
- 实际项目里,示例一般存在 JSON 文件里,不会硬写在代码中,方便批量维护
三、输出解析:把自然语言变成程序能用的数据
解决什么问题
模型默认输出的是一大段自然语言,但业务代码需要的是能直接用的结构化数据(比如字典、列表)。没有解析器的话,你得自己写正则、切字符串来提取信息,又麻烦又容易出错。
输出解析器就是专门做这个转换的,它会引导模型按指定格式输出,再自动转成程序能直接处理的数据类型。
1. 最基础:StrOutputParser
它的作用很简单:把模型返回的 AIMessage 对象,转成纯字符串。
别小看这个转换,LangChain 里组件串联的时候,类型不统一会出各种问题。它是所有链式调用的基础底座。
from langchain_core.output_parsers import StrOutputParser
parser = StrOutputParser()
# 链式调用:提示词 → 模型 → 解析器
chain = prompt | llm | parser
# 直接传参数调用,一步到位拿到字符串结果
result = chain.invoke({"concept": "Python列表", "audience": "初中生"})
print(result)
print(type(result)) # 纯字符串类型
| 是 LangChain 的链式语法,意思是把前一个的输出,传给后一个当输入,不用手动一步步传参。
2. 快速原型:JsonOutputParser
想让模型输出键值对,直接拿到 Python 字典?用这个解析器最快,不需要提前定义数据结构,自动引导模型输出 JSON。
from langchain_core.output_parsers import JsonOutputParser
parser = JsonOutputParser()
# 模板里嵌入格式要求
prompt = PromptTemplate(
template="请介绍一部动漫,包含名称、类型、推荐理由3个字段。{format_instructions}",
input_variables=[],
partial_variables={"format_instructions": parser.get_format_instructions()}
)
chain = prompt | llm | parser
result = chain.invoke({})
print(result)
print(result["名称"]) # 直接按键取值
它的优点是简单快捷,缺点是不校验字段类型,适合快速做 Demo。
3. 工程首选:PydanticOutputParser
正式项目里推荐用这个。它需要你先定义一个数据模型,明确每个字段的类型和说明,解析器不仅会引导模型按格式输出,还会自动校验结果,格式不对直接报错,稳定性高很多。
from langchain_core.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field
# 1. 定义数据模型
class AnimeInfo(BaseModel):
name: str = Field(description="动漫名称")
anime_type: str = Field(description="动漫类型,比如治愈、热血、悬疑")
reason: str = Field(description="推荐理由,20字以内")
# 2. 创建解析器
parser = PydanticOutputParser(pydantic_object=AnimeInfo)
# 3. 模板+链式调用
prompt = PromptTemplate(
template="请推荐一部高分动漫。{format_instructions}",
input_variables=[],
partial_variables={"format_instructions": parser.get_format_instructions()}
)
chain = prompt | llm | parser
result = chain.invoke({})
print(result)
print(result.name) # 直接访问属性,有代码提示
更多推荐

所有评论(0)