消息属性:content、content_blocks
content
消息的 content 可以理解为数据内容,它是弱类型的,既支持字符串,也支持列表(列表元素通常为字典)。
举例1:存储字符串
如果只是纯文本内容,直接传递字符串即可。
from langchain.messagesimportHumanMessage msg1=HumanMessage(content="你好啊")msg2=HumanMessage("你好啊")print(msg1)print(msg2)说明:当 content 内容只有字符串时,可以省略参数名称。
举例2:存储字典列表
如果需要发送的不只是文本,例如多模态内容,则需要使用 content 的字典列表形式。
字典内容需遵循模型供应商的 API 规范,以 openai:gpt-4.1 为例:
参考官方文档:https://developers.openai.com/api/reference/python/resources/chat/subresources/completions/methods/create
或
https://developers.openai.com/api/reference/resources/chat/subresources/completions/methods/create?site_locale=en
测试代码:
importbase64 from langchain.chat_modelsimportinit_chat_model from langchain.messagesimportHumanMessage from dotenvimportload_dotenvimportos load_dotenv(override=True)model=init_chat_model(model="gpt-5.4-mini",model_provider="openai",api_key=os.getenv("CLOSEAI_API_KEY"),base_url=os.getenv("CLOSEAI_API_BASE"))def encode_image(img_path,img_type='jpeg'):"""将一张本地图片转换成 Base64 编码的 Data URI 字符串,方便在文本中嵌入图片数据""" with open(img_path,"rb")as img_file:returnf"data:image/{img_type};base64,{base64.b64encode(img_file.read()).decode("utf-8")}"# 图像路径img_path="D:\\workspace_pycharm_llm\\chapter022_model\\img.png"# 获取图像base64编码字符串base64_image=encode_image(img_path)response=model.invoke([HumanMessage(content=[{'type':'text','text':'这张图里有什么?'},{'type':'image_url',"image_url":base64_image,}])])print(response.content)content_blocks
在LangChain1.x中,content_blocks是消息对象(BaseMessage)的一项重大升级。它的核心目标是提供一种跨模型供应商、标准化的多模态数据结构。
过去、处理图片、音频、甚至是模型生成的“思维链内容时”,不同供应商的API格式各异,导致开发者需要写大量的适配代码。content_blocks的出现终结了这种混乱。
在LangChain1.2版本中,消息对象的content属性依然存在(为了向前兼容),但新增了content_blocks属性,可以将content解析为标准、类型安全的表示。
- 数据结构:它是一个list[TypedDict]
- 统一格式:每个block都有一个type字段,用于区分内容类型
- 支持类型:包括text(文本),image(图片),audio(音频),video(视频)、tool_call(工具调用)以及reasoning(推理/思维链)
输入格式化
对于复杂的对话(带图片或工具结果),建议使用content_blocks列表形式构建HumanMessage或AIMessage
借助content_blocks,我们可以用一套标准代码,无缝地在不同厂商的模型之间切换。
输出格式化
content_blocks还可用于输出格式化,以deepseek官网的deepseek-v4-flash为例,其输出包含思考内容,后者位于additional_kwargs的reasoning_content字段下。比如:
不同的模型其输出格式可能不同,仅为提取思考内容,切换模型都可能需要更改代码,非常不方便。content_blocks提供了统一的输出格式,可以将不同格式的响应统一为标准格式。
注意:content_blocks是懒加载的,即调用时才会解析
说明:优先检查response.content_blocks而不是response.content,特别是当你需要获取“思维链”或者“引用”信息时。