纲要

  • 快速回顾与环境准备
    • 已有环境:Python 3.12+、虚拟环境、Jupyter(可选)
    • 必装依赖:langchainlangchain-openaipython-dotenv
    • API Key 配置与 .env 文件
  • LangChain 三大基础模块
    • 大模型组件(ChatOpenAI):创建大脑
    • 提示词模板(ChatPromptTemplate):动态化指令
    • 输出解析器(Output Parser):文本转结构化数据
  • 一步步构建第一个智能应用
    • 任务描述:起名大师,根据国家和性别生成名字列表
    • 代码演进过程
      • 第 1 步:直接调用模型生成名字
      • 第 2 步:引入提示词模板,参数化国家和性别
      • 第 3 步:添加输出解析器,将结果强制转为列表
    • 完整可运行代码
  • 在线 IDE 辅助学习
    • 免配置环境的优势与适用场景
    • 本地开发与在线工具的配合使用建议

快速回顾与环境准备

在之前的章节中,我们已经了解了 LangChain 是什么,并完成了 Python 虚拟环境的搭建。如果你还没准备好,请确认以下几步:

  1. Python 版本 ≥ 3.8,推荐 3.12+。
  2. 创建并激活虚拟环境(避免依赖冲突)。
  3. 安装核心依赖
pip install langchain langchain-openai python-dotenv
  1. 在项目根目录创建 .env 文件,填写你的大模型 API Key。本示例以 OpenAI 的 gpt-3.5-turbo 为例,你也可以换成 DeepSeek、通义千问等任何 LangChain 支持的模型,只需修改对应的包和参数。
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxx
OPENAI_BASE_URL=https://api.openai.com/v1

OPENAI_BASE_URL 是可选的,当你在国内网络环境下可能需要配置代理地址,或者使用兼容 OpenAI 接口的第三方服务。

LangChain 三大基础模块

任何 LangChain 应用都由三个核心模块串联而成:模型(Model)提示词(Prompt)输出解析器(Output Parser)。理解这三个模块,你就掌握了 LangChain 的骨架。

模块 作用 LangChain 中常用类
大模型组件 接收提示并生成文本 ChatOpenAI, ChatDeepSeek
提示词模板 将指令参数化,动态构造提示 ChatPromptTemplate
输出解析器 把模型的自然语言回答转为结构化数据(列表、JSON 等) StrOutputParser, CommaSeparatedListOutputParser, JsonOutputParser

它们通过 LCEL(LangChain Expression Language)的管道符 | 串联成一个链(Chain),数据从左向右流动,清晰且易调试。

用户输入参数

Prompt 模板格式化

LLM 调用

Output Parser 解析

结构化结果

一步步构建第一个智能应用

我们的目标是实现一个“起名大师”应用:用户可以指定国家特色(如“中国”“美国”)和性别(男孩/女孩),模型返回多个符合该文化背景的名字,最终以 Python 列表的形式输出,便于后续程序消费。

下面我们通过代码的逐步演进,展示各个模块如何组合。

第 1 步:直接调用模型,生成名字

最原始的用法:硬编码一句提示词,调用模型得到文本结果。

from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
import os

load_dotenv()

llm = ChatOpenAI(
    model="gpt-3.5-turbo",
    temperature=0.7,
    openai_api_key=os.getenv("OPENAI_API_KEY"),
    openai_api_base=os.getenv("OPENAI_BASE_URL"),
)

response = llm.invoke("帮我起一个具有中国特色的男孩名字")
print(response.content)  # 输出类似:狗剩

这种方法简单直接,但每次提问都要重新构造提示字符串,且返回的仍然是普通文本,不利于后续处理。

第 2 步:引入提示词模板

将提示中的可变部分(国家、性别)抽取为参数,使用 ChatPromptTemplate 动态组装。

from langchain_core.prompts import ChatPromptTemplate

# 定义模板,用 {变量名} 作为占位符
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个专业的起名大师。"),
    ("human", "请帮我起一个具有{country}特色的{boy_or_girl}名字,只返回名字本身,不要多余解释。")
])

# 格式化提示
formatted = prompt.invoke({"country": "美国", "boy_or_girl": "男孩"})
print(formatted.to_messages())

此时,你只需改变传入的参数,就可以得到不同文化背景的名字提示。注意我们已经在提示中加了一条约束:“只返回名字本身,不要多余解释”,这能有效减少模型“废话”,为后续解析铺路。

第 3 步:加上输出解析器,获取结构化数据

如果希望一次生成多个名字,并且以 Python 列表形式返回,就需要输出解析器的帮助。LangChain 内置了 CommaSeparatedListOutputParser,它可以自动让模型输出逗号分隔的列表,然后解析成真正的列表对象。

from langchain_core.output_parsers import CommaSeparatedListOutputParser

parser = CommaSeparatedListOutputParser()
# 解析器会向提示中自动添加格式说明
print(parser.get_format_instructions())
# 输出:Your response should be a list of comma separated values, eg: `foo, bar, baz`

将这三个组件串联成链:

chain = prompt | llm | parser
result = chain.invoke({"country": "中国", "boy_or_girl": "男孩"})
print(result)  # 比如:['狗蛋', '铁柱', '建国', '志强']
print(type(result))  # <class 'list'>

现在你得到的是干净的 Python 列表,可以直接插入数据库、返回给前端或参与后续逻辑。

完整可运行代码

整合以上步骤,保存为 name_master.py,确保 .env 文件配置正确,即可直接运行。

import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import CommaSeparatedListOutputParser

# 加载配置
load_dotenv()

# 初始化模型
llm = ChatOpenAI(
    model="gpt-3.5-turbo",
    temperature=0.7,
    openai_api_key=os.getenv("OPENAI_API_KEY"),
    openai_api_base=os.getenv("OPENAI_BASE_URL"),
)

# 提示词模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个专业的起名大师。"),
    ("human", "请帮我起4个具有{country}特色的{boy_or_girl}名字,"
              "仅返回用逗号分隔的名字,不要序号,不要解释。\n{format_instructions}")
])

# 输出解析器
parser = CommaSeparatedListOutputParser()

# 构建链
chain = prompt | llm | parser

if __name__ == "__main__":
    # 示例:起4个美国特色的男孩名字
    params = {
        "country": "美国",
        "boy_or_girl": "男孩",
        "format_instructions": parser.get_format_instructions(),
    }
    names = chain.invoke(params)
    print("生成的名字列表:", names)
    # 遍历使用
    for i, name in enumerate(names, 1):
        print(f"{i}. {name.strip()}")

运行结果示例:

生成的名字列表: ['James', 'William', 'Liam', 'Benjamin']
1. James
2. William
3. Liam
4. Benjamin

如果遇到网络问题,可以尝试将 model 切换为国内可访问的模型,或者调整 temperature 参数观察生成结果的变化。temperature=0 会让结果更确定,适合对一致性要求高的场景;temperature=0.7~1.0 则赋予模型更大的创造自由。

在线 IDE 辅助学习

对于不想折腾本地环境的初学者,市面上也出现了一些在线 AI 开发平台,它们预装了 LangChain、Python 环境和常用依赖,打开浏览器即可编写和运行代码。这类工具的优势在于“零配置”,非常适合快速体验课程示例、验证想法。但受资源和安全限制,这类平台通常不支持异步流式输出、多线程等高级特性,因此完整的学习路径仍建议回归本地开发。

无论你选择哪种方式,LangChain 的核心模块和用法都完全一致。你可以先在在线 IDE 中跑通第一个链,再逐步迁移到本地,为后续构建 Agent、RAG 等复杂应用打下基础。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐