LangChain:模型I/O

LangChainModel I/O(Input/Output)是框架中负责与语言模型(LLM)进行输入输出交互的核心模块,是连接开发者与大语言模型(LLMs)的核心交互层,提供了一套标准化的流程实现输入构建模型调用结果解析的全链路管理。

Mode I/O组件是对各个LLM模型平台API的封装,这个组件封装了市场公开的绝大部分LLM模型接口。

具体可参阅:LangChain > All chat models

I/O 模型核心组件

提示模板(PromptTemplate)

  • 功能:动态生成文本提示,支持变量插值和模板复用

  • 关键特性

    • 支持 f-string 风格变量替换
    • 可组合嵌套模板
    • 支持与示例选择器(ExampleSelector)结合
  • 示例

    python

    复制

    1
    2
    3
    4
    5
    6
    7
    from langchain.prompts import PromptTemplate

    # 基础模板
    template = "请用{style}风格,写一篇关于{topic}的短文"
    prompt = PromptTemplate.from_template(template)
    formatted_prompt = prompt.format(style="武侠", topic="人工智能")
    # Output: "请用武侠风格,写一篇关于人工智能的短文"

示例选择器(ExampleSelector)

  • 功能:动态选择最相关的示例用于 few-shot 学习

  • 常用类型

    • LengthBasedExampleSelector:根据长度自动选择示例
    • SemanticSimilarityExampleSelector:基于语义相似度选择
    • MaxMarginalRelevanceExampleSelector:平衡相关性与多样性
  • 示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
    from langchain_community.vectorstores import Chroma

    examples = [{"input": "高兴", "output": "😊"},
    {"input": "悲伤", "output":😢}]
    example_selector = SemanticSimilarityExampleSelector.from_examples(
    examples,
    embeddings_model, # 需预先加载嵌入模型
    Chroma,
    k=1
    )

输出解析器(OutputParser)

  • 功能:将模型原始输出转换为结构化数据

  • 主要类型

    • CommaSeparatedListOutputParser:解析逗号分隔列表
    • StructuredOutputParser:生成结构化输出
    • PydanticOutputParser:基于 Pydantic 模型验证输出
  • 示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    from langchain.output_parsers import PydanticOutputParser
    from pydantic import BaseModel

    class JokeSchema(BaseModel):
    setup: str
    punchline: str

    parser = PydanticOutputParser(pydantic_object=JokeSchema)
    model_output = """{
    "setup": "为什么程序员总分不清万圣节和圣诞节?",
    "punchline": "因为 Oct 31 == Dec 25"
    }"""
    parsed = parser.parse(model_output)

完整使用流程示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from langchain.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain.output_parsers import CommaSeparatedListOutputParser

# 1. 初始化组件
model = ChatOpenAI()
output_parser = CommaSeparatedListOutputParser()

# 2. 构建提示模板
template = """列出与{theme}相关的{num}个关键词,格式:CSV列表"""
prompt = ChatPromptTemplate.from_template(template)
prompt = prompt.partial(format_instructions=output_parser.get_format_instructions())

# 3. 创建处理链
chain = prompt | model | output_parser

# 4. 执行调用
result = chain.invoke({"theme": "气候变化", "num": 5})
print(result)
# 示例输出: ['温室气体', '碳排放', '可再生能源', '极端天气', '碳中和']

高级功能

动态提示组合*

1
2
3
base_prompt = PromptTemplate("你是一个{role}")
detail_prompt = PromptTemplate("擅长使用{language}编程")
combined_prompt = base_prompt + detail_prompt

流式输出处理

1
2
3
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler

chain = prompt | model.bind(streaming=True, callbacks=[StreamingStdOutCallbackHandler()])

多模型路由

1
2
3
4
5
from langchain.schema.runnable import RouterRunnable
router = RouterRunnable({
"creative": creative_model,
"technical": tech_model
})

最佳实践

模板管理

  • 将常用模板存储在外部 YAML 文件
  • 使用 FewShotPromptTemplate 管理多示例场景

错误处理

1
2
3
4
5
from langchain.schema import OutputParserException
try:
parser.parse(invalid_output)
except OutputParserException as e:
print(f"解析失败: {e}")

验证机制

1
2
from langchain.output_parsers import RetryOutputParser
retry_parser = RetryWithErrorOutputParser.from_llm(parser, model)

典型应用场景

  1. 结构化数据生成(JSON/XML)
  2. 多轮对话上下文管理
  3. 多模态输入处理(结合图像/文本)
  4. 领域特定问答系统
  5. 自动化报告生成

通过合理组合这些 I/O 组件,开发者可以构建出灵活、健壮的 LLM 应用流水线。

作者

光星

发布于

2025-04-07

更新于

2025-04-13

许可协议

评论