很多刚接触大模型开发的同学都会遇到三个共性麻烦:

  • 换个模型就要重写一遍调用代码,来回适配接口很折腾
  • 提示词每次都手写大段重复内容,改个规则要翻遍所有代码
  • 模型输出的都是自然语言,想取个数据还得写正则拆分,又麻烦又容易错

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)  # 直接访问属性,有代码提示
Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐