目录

一、LangChain 框架基础

1.1 LLM 与 Chat Model 核心区别

1.2 LangChain 框架定位

二、6 大实战案例手把手教学

环境前置

实战 1:Chat Model 基础对话调用

实战 2:提示模板复用(ChatPromptTemplate)

实战 3:少样本提示(FewShotChatMessagePromptTemplate)

实战 4:列表输出解析(CommaSeparatedListOutputParser)

实战 5:结构化信息提取(PydanticOutputParser)

实战 6:LCEL 链式调用(核心最佳实践)

三、实战总结



一、LangChain 框架基础

1.1 LLM 与 Chat Model 核心区别

LLM(大语言模型):本质是 Transformer 解码器架构的生成式模型,核心逻辑是根据上文 token 预测下一个 token,仅支持单轮文本生成,无原生上下文记忆,直接调用 API 为独立单次交互。

Chat Model(聊天模型):是 LLM 的场景化优化版本,像豆包、通义千问等对话产品均属此类,具备上下文记忆能力,输入为结构化角色消息(系统 / 用户 / AI 消息),适配多轮对话场景。

1.2 LangChain 框架定位

LangChain 并非新的大模型,而是LLM 应用开发的标准化框架,将「模型调用、提示词编写、输出解析、流程串联」等复杂操作拆分为即插即用组件,无需从零开发,直接解决几大开发痛点:

  1. 大模型输出格式混乱
  2. 重复编写提示词效率低
  3. 少样本引导模型输出困难

二、6 大实战案例手把手教学

环境前置

命令行窗口执行:

# 核心依赖安装
pip install langchain-openai
# 配置环境变量(推荐,避免密钥硬编码)
# Windows:set DASHSCOPE_API_KEY=你的阿里云API密钥
# Mac/Linux:export DASHSCOPE_API_KEY=你的阿里云API密钥

    实战 1:Chat Model 基础对话调用

    目标:掌握 LangChain 调用聊天模型的基础流程,理解角色消息格式

    代码:

    from langchain_openai import ChatOpenAI
    from langchain.schema.messages import HumanMessage, SystemMessage
    import os
    
    # 初始化通义千问(OpenAI兼容接口)
    model = ChatOpenAI(
        model="qwen-plus",
        openai_api_key=os.getenv("DASHSCOPE_API_KEY"),
        openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",
        temperature=1.2,
        max_tokens=300
    )
    
    # 构造角色化对话消息
    messages = [
        SystemMessage(content="作为数学课助教,用通俗语言解释数学原理"),
        HumanMessage(content="什么是勾股定理?"),
    ]
    
    # 调用并输出
    response = model.invoke(messages)
    print(response.content)
    

    结果:

    核心知识点:Chat Model 输入为角色化消息列表SystemMessage定义模型行为,HumanMessage为用户输入。


    实战 2:提示模板复用(ChatPromptTemplate)

    目标:解决重复写提示词问题,实现动态参数替换与批量调用

    代码:

    from langchain.prompts import (
        SystemMessagePromptTemplate,
        HumanMessagePromptTemplate,
        ChatPromptTemplate
    )
    from langchain_openai import ChatOpenAI
    import os
    
    # 1. 单独定义提示模板
    system_template = SystemMessagePromptTemplate.from_template(
        "你是专业翻译,将{input_language}译为{output_language},按{style}输出,仅返回译文"
    )
    human_template = HumanMessagePromptTemplate.from_template(
        "文本:{text}"
    )
    
    # 2. 可以直接把1的单独定义整合为统一提示模板
    prompt_template = ChatPromptTemplate.from_messages([
        ("system", "你是专业翻译,将{input_language}译为{output_language},按{style}输出,仅返回译文"),
        ("human", "文本:{text}")
    ])
    
    # 3. 初始化模型
    model = ChatOpenAI(
        model="qwen-plus",
        openai_api_key=os.getenv("DASHSCOPE_API_KEY"),
        openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1"
    )
    
    # 4. 批量调用
    batch_inputs = [
        {"input_language":"汉语","output_language":"汉语","text":"勿以善小而不为","style":"白话文"},
        {"input_language":"法语","output_language":"英语","text":"Je suis désolé","style":"古英语"}
    ]
    
    for item in batch_inputs:
        res = model.invoke(prompt_template.invoke(item))
        print(res.content)
    

    结果:

    核心知识点ChatPromptTemplate支持参数化提示词,整合多角色消息,大幅提升提示复用率。


    实战 3:少样本提示(FewShotChatMessagePromptTemplate)

    目标:通过少量示例引导模型固定输出格式,无需冗长提示词

    代码:

    from langchain_openai import ChatOpenAI
    from langchain.prompts import FewShotChatMessagePromptTemplate, ChatPromptTemplate
    import os
    
    # 1. 定义示例格式
    example_prompt = ChatPromptTemplate.from_messages([
        ("human", "格式化客户信息:\n姓名->{name}\n年龄->{age}\n城市->{city}"),
        ("ai", "##客户信息\n-姓名:{f_name}\n-年龄:{f_age}\n-地址:{f_addr}")
    ])
    
    # 2. 少样本示例数据
    examples = [
        {"name":"张三","age":"27","city":"长沙","f_name":"张三","f_age":"27岁","f_addr":"湖南省长沙市"},
        {"name":"李四","age":"42","city":"广州","f_name":"李四","f_age":"42岁","f_addr":"广东省广州市"}
    ]
    
    # 3. 构建少样本提示
    few_shot_prompt = FewShotChatMessagePromptTemplate(
        example_prompt=example_prompt,
        examples=examples
    )
    
    # 4. 最终提示
    final_prompt = ChatPromptTemplate.from_messages([
        few_shot_prompt,
        ("human", "{input}")
    ])
    
    # 5. 调用模型
    model = ChatOpenAI(
        model="qwen-plus",
        openai_api_key=os.getenv("DASHSCOPE_API_KEY"),
        openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",
        temperature=0.1
    )
    
    res = model.invoke(final_prompt.invoke({"input":"格式化:姓名->王五,年龄->31,城市->郑州"}))
    print(res.content)
    

    结果:

    核心知识点:少样本提示用少量示例替代长提示temperature=0.1保证输出格式稳定。


    实战 4:列表输出解析(CommaSeparatedListOutputParser)

    目标:将模型文本输出转为 Python 列表,解决格式混乱问题

    第三方库:
     

    • ChatOpenAI:LangChain 封装的 OpenAI 风格聊天模型类(这里兼容阿里云通义千问的 API 格式),用于调用大模型。
    • CommaSeparatedListOutputParser:逗号分隔列表解析器,能把模型返回的「A,B,C」格式文本转换成 Python 列表 [A,B,C]
    • ChatPromptTemplate:LangChain 的聊天型提示模板,用于构建结构化的对话提示(区分系统 / 人类角色)。
    • os:用于读取环境变量中的 API 密钥(避免硬编码密钥,更安全)。

    代码:

    from langchain_openai import ChatOpenAI
    from langchain.output_parsers import CommaSeparatedListOutputParser
    from langchain.prompts import ChatPromptTemplate
    import os
    
    # 1. 初始化解析器
    parser = CommaSeparatedListOutputParser()
    parser_instr = parser.get_format_instructions()
    
    # 2. 提示模板
    prompt = ChatPromptTemplate.from_messages([
        ("system", "{parser_instr}"),
        ("human", "列出5个{subject}汽车品牌")
    ])
    
    # 3. 模型调用
    model = ChatOpenAI(
        model="qwen-plus",
        openai_api_key=os.getenv("DASHSCOPE_API_KEY"),
        openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1"
    )
    
    # 4. 解析输出
    raw_res = model.invoke(prompt.invoke({"subject":"中国","parser_instr":parser_instr}))
    print(raw_res)
    parsed_res = parser.invoke(raw_res)
    print("解析后列表:", parsed_res)
    

    注释:

    • parser = CommaSeparatedListOutputParser():创建解析器实例,核心作用是标准化模型输出格式,确保后续能把文本转成列表。
    • parser_instr = parser.get_format_instructions():获取解析器的「格式说明指令」(比如:"请将输出格式化为逗号分隔的列表,例如:苹果,香蕉,橙子"),这行指令会传给模型,强制模型按逗号分隔的格式输出,方便后续解析。

    ChatPromptTemplate.from_messages():按「角色 - 内容」的格式构建提示模板,模拟真实的对话场景:

    • ("system", "{parser_instr}"):系统角色,传入解析器的格式说明,告诉模型「必须按逗号分隔列表输出」。
    • ("human", "列出5个{subject}汽车品牌"):人类用户的提问,{subject}占位符(后续会传入「中国」「德国」等具体值)。

    结果:

    核心知识点:解析器自动将文本转为 Python 数据结构,无需手动字符串处理。


    实战 5:结构化信息提取(PydanticOutputParser)

    目标:自定义数据结构,精准提取多字段、多类型结构化信息,可以理解成Python的字典类型

    第三方库:
     

    • from typing import List:导入列表类型注解,用于定义「题材」字段的类型(支持多个题材,如 ["喜剧", "悬疑"])。
    • PydanticOutputParser:LangChain 专为 Pydantic 模型设计的输出解析器,能把模型返回的文本转换成 Pydantic 对象(强类型,可直接通过属性调用)。
    • ChatPromptTemplate:构建结构化的聊天提示模板,区分系统 / 人类角色。
    • BaseModel, Field:Pydantic 的核心类 ——BaseModel 是自定义数据模型的基类,Field 用于给字段添加描述、示例,帮助大模型理解要输出的内容。
    • ChatOpenAI:兼容 OpenAI API 格式的模型调用类(这里用于调用阿里云通义千问)。
    代码:
    from typing import List
    from langchain.output_parsers import PydanticOutputParser
    from langchain.prompts import ChatPromptTemplate
    from langchain_core.pydantic_v1 import BaseModel, Field
    from langchain_openai import ChatOpenAI
    import os
    
    # 1. 定义结构化数据模型
    class FilmInfo(BaseModel):
        film_name: str = Field(description="电影名", example="唐人街探案")
        director: str = Field(description="导演", example="陈思诚")
        genres: List[str] = Field(description="题材", example=["喜剧"])
    
    # 2. 初始化解析器
    parser = PydanticOutputParser(pydantic_object=FilmInfo)
    
    # 3. 提示模板
    prompt = ChatPromptTemplate.from_messages([
        ("system", "{parser_instr} 输出使用中文"),
        ("human", "从概述提取电影名、导演、题材:###{text}###")
    ])
    
    # 4. 调用&解析
    model = ChatOpenAI(
        model="qwen-plus",
        openai_api_key=os.getenv("DASHSCOPE_API_KEY"),
        openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1"
    )
    
    text = """《唐人街探案》由陈思诚执导,是喜剧题材电影"""
    res = model.invoke(prompt.invoke({
        "text":text,
        "parser_instr":parser.get_format_instructions()
    }))
    
    result = parser.invoke(res)
    print(result)
    print("电影名:", result.film_name)
    print("题材:", result.genres)
    
    注释:
    • class FilmInfo(BaseModel):自定义一个 Pydantic 数据模型,继承 BaseModel,定义要提取的三个核心字段:
      • film_name: str:字符串类型,存储电影名;Field(description="电影名", example="唐人街探案") 给大模型提供「字段含义 + 示例」,让模型更精准输出。
      • director: str:字符串类型,存储导演名。
      • genres: List[str]:列表类型(支持多个题材),存储电影题材;示例 ["喜剧"] 告诉模型要输出列表格式。
    • Pydantic 对象本质是 基于 Pydantic 库的 BaseModel 自定义类创建的实例,可以把它理解成:带 “严格说明书” 的结构化数据容器 —— 它不仅能存储数据,还会自动校验数据的类型和格式是否符合你定义的规则,且支持通过「对象。属性」的方式便捷访问数据。

    结果:

    核心知识点BaseModel定义输出规范,解析器自动校验数据类型,支持复杂结构化提取。


    实战 6:LCEL 链式调用(核心最佳实践)

    目标:用管道符|串联组件,极简代码实现全流程调用

    代码:

    from langchain_openai import ChatOpenAI
    from langchain.output_parsers import CommaSeparatedListOutputParser
    from langchain.prompts import ChatPromptTemplate
    import os
    
    # 1. 定义组件
    prompt = ChatPromptTemplate.from_messages([
        ("system", "{parser_instr}"),
        ("human", "列出5个{subject}汽车品牌")
    ])
    parser = CommaSeparatedListOutputParser()
    model = ChatOpenAI(
        model="qwen-plus",
        openai_api_key=os.getenv("DASHSCOPE_API_KEY"),
        openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1"
    )
    
    # 2. LCEL链式串联(核心)
    chain = prompt | model | parser
    
    # 3. 一键调用
    res = chain.invoke({
        "subject":"中国",
        "parser_instr":parser.get_format_instructions()
    })
    print(res)
    

    结果:

    核心知识点:LCEL 用|定义数据流向,提示→模型→解析一步到位,代码极简、可复用性拉满。


    三、实战总结

    1. Chat Model:角色化消息是对话基础,SystemMessage控制模型行为;
    2. 提示模板:参数化 + 复用,解决提示词冗余问题;
    3. 少样本提示:少量示例引导格式,比长提示更稳定;
    4. 输出解析:文本转结构化数据,适配工程化开发;
    5. Pydantic 解析:自定义结构,精准提取复杂信息;
    6. LCEL 链式:LangChain 标准开发范式,极简高效。

    本文所有代码可直接运行,适配国内通义千问模型,替换model与 API 配置即可兼容 ChatGPT、Ollama 等模型,快速落地各类 LLM 应用。

    Logo

    AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

    更多推荐