前言:
我们如何给大模型搭上话很关键,我们可以定义大模型的人设,任务,基本都是通过提示词完成的,我们常用的百分之90都是对话模型,这边只讲常用的ChatPrompttemplate,非对话模型的建议了解即可
1. ChatPromptTemplate.from_template
作用:把一段纯文本变成模板。
特点:最简单、最快,不区分角色,默认当作用户消息(Human)。
这边可以看到输出结果是一个数组,具体而言这是一个 LangChain 框架中的 对象(Object),具体类型是 HumanMessage 类的一个 实例(Instance)。
- 所属库:来自于
langchain_core.messages。 2. 作用:它代表了用户发送给 AI 的消息。在对话流中,LangChain 会将对话统一封装成特定的消息对象(如HumanMessage代表用户,AIMessage代表 AI,SystemMessage代表系统指令)。 3. 数据结构: -content: 消息的具体文本内容(这里是“讲一个关于小狗的笑话”)。 -additional_kwargs: 存储额外参数的字典(预留位)。 -response_metadata: 存储与该消息相关的元数据。 你可能好奇我们输入给AI也是带这些奇怪的东西吗?并不是的,additional_kwargs,response_metadata这些都属于本地字段,我们发送的只有content
往后看会再说的
2. ChatPromptTemplate.from_messages
作用:接收消息列表,支持角色区分(system / human / ai)。
特点:聊天机器人必备,可加人设、历史记录。
2.1最常用写法(元组列表)
1 | prompt = ChatPromptTemplate.from_messages([ |
==output:==
1 | [ |
3. 真正发给 AI 的「原始请求体」(以 OpenAI GPT 为例)
当你用prompt | model调用大模型时,LangChain 会自动把这些消息对象,转换成 OpenAI API 要求的标准 JSON 格式,只提取content和角色信息,最终发出去的真实内容是:
1 | { |
你看:
- 完全没有
additional_kwargs、response_metadata这些字段 - 只有 AI 能识别的
role(角色)和content(内容) - 这就是 AI 服务器收到的、100% 真实的输入文本
输出解析器
这个是langchain返回给我们的信息
其中只有 content 是 AI 真正说的话。
其他全是 LangChain 包的 “壳 + 调试信息 + 计费信息”,AI 根本看不见,你也不用管。
真正 AI 回答 = 只有这一句
content=“香樟”翻译成英语是 camphor tree。
这里我们先学习一个最近的的解析器,StrOutputParser 是 LangChain 中最基础、最常用的输出解析器,它的作用很简单:
把 LLM 的输出对象(AIMessage)转换成纯字符串
StrOutputParser 后,直接得到字符串,就这么简单
我学这个之前问了Kimi,他说这个是传统解析器,其实已经不用了
输出解析器(Output Parsers)是 LangChain 中用于将 LLM 的文本输出转换为结构化数据的关键组件。根据 LangChain 1.x 的最新发展,输出解析器的使用方式发生了重要变化。
核心变化:从解析器到原生结构化输出
重要提示:LangChain 1.x 推荐使用 with_structured_output 或 create_agent 的 response_format 参数,而非传统的输出解析器。
现代 LLM(如 GPT-4、Claude、Gemini)已原生支持结构化输出,传统解析器仅在以下场景使用:
- 旧模型不支持原生结构化输出
- 需要额外的后处理或验证逻辑
1. 现代推荐方式:with_structured_output
这是 LangChain 当前最推荐的方式,直接绑定 Pydantic 模型:
1 | from pydantic import BaseModel, Field |
这个是输出的结果
1 | 城市: 上海 |
但是呢为了应对传统的情况还是得学一下的传统解析器
2 传统的输出解析器
2.1我们先定义一个聊天提示词
1 | prompt = ChatPromptTemplate.from_messages([ |
2.2 定义输出解析器
1 | from langchain_core.prompts import ChatPromptTemplate |
我们可以康康这个解析器长啥样
1 | the output should be formatted as a JSON instance that conforms to the JSON schema below. |
大致的意思就是你得用json格式输出,并且把我后面的自定义的数据结构放进去了。
测试结果
1 |
|
这个是输出结果,可以看到是json完全没问题!
1 | {"translation":"camphor tree","confidence":0.95,"notes":"在中国语境中,“香樟”常指具有芳香气味、广泛用于行道与园林的樟树(Cinnamomum camphora),而非单纯的‘camphor’提取物,故译为‘camphor tree’以兼顾植物学与文化意象。"} |
还有如何在 from_messages 中优雅地使用 partial_variables?
partial_variables 和在的 ChatPromptTemplate 结合起来,其实非常简单。不需要修改 from_messages 的主体,只需要在构建 Prompt 实例时传入即可:
1 | # 1. 定义模版 |