news 2026/9/6 14:08:35

LangChain 中 content 与 content_block 的使用详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LangChain 中 content 与 content_block 的使用详解

1. 引言

在使用 LangChain 进行大模型应用开发时,contentcontent_block是两个经常出现但又容易混淆的概念。它们分别出现在不同的抽象层级中,承担着不同的职责。本文将从定义、使用场景、代码示例和常见问题几个方面,带你彻底搞懂这两个概念。

2. 什么是 content

content是 LangChain 中消息(Message)对象的核心字段,用于承载一条消息的实际文本内容。无论是用户输入、AI 回复还是系统提示,最终都会以content的形式存储在消息对象中。

2.1 基本用法

在 LangChain 中,构造一条消息非常简单:

fromlangchain_core.messagesimportHumanMessage,AIMessage# 构造用户消息user_msg=HumanMessage(content="你好,请介绍一下你自己")# 构造 AI 回复ai_msg=AIMessage(content="你好!我是基于大语言模型构建的 AI 助手。")

2.2 content 的多种类型

content字段并不局限于纯文本,它还可以是其他类型:

# 纯文本msg1=HumanMessage(content="你好")# 多模态内容(图片 + 文本)msg2=HumanMessage(content=[{"type":"text","text":"请描述这张图片"},{"type":"image_url","image_url":{"url":"https://example.com/cat.jpg"}}])# 工具调用结果msg3=AIMessage(content="",tool_calls=[...])

3. 什么是 content_block

content_block是 LangChain 中用于表示消息内容结构化组成部分的概念。当一条消息的content包含多个不同类型的片段时,每个片段就是一个content_block

3.1 为什么需要 content_block

在实际应用中,一条消息往往不只是纯文本。例如:

  • 一段文本 + 一张图片
  • 一段文本 + 一个工具调用请求
  • 多个文本片段组合

如果只用单一的字符串来表示content,就无法区分这些不同类型的片段。content_block正是为了解决这个问题而设计的。

3.2 常见的 content_block 类型

LangChain 提供了多种内置的 content block 类型:

fromlangchain_core.messagesimport(TextContentBlock,ImageContentBlock,ToolCallBlock,)# 文本块text_block=TextContentBlock(text="这是一段文本")# 图片块image_block=ImageContentBlock(url="https://example.com/image.png",detail="auto")# 工具调用块tool_block=ToolCallBlock(id="call_123",name="search",args={"query":"LangChain"})

4. content 与 content_block 的关系

理解两者的关系是掌握它们的关键:

  • content是消息的顶层字段,是「容器」。
  • content_blockcontent内部的结构化单元,是「内容」。

content为字符串时,它等价于一个纯文本块;当content为列表时,列表中的每个元素就是一个content_block

fromlangchain_core.messagesimportHumanMessage# 方式一:content 为字符串(隐式单个文本块)msg1=HumanMessage(content="你好")# 方式二:content 为列表(显式多个 content_block)msg2=HumanMessage(content=[{"type":"text","text":"你好"},{"type":"text","text":"请分析下面的数据"}])# 两种方式在底层都会被转换为 content_block 列表print(msg1.content)# 输出: 你好print(msg2.content)# 输出: [{'type': 'text', 'text': '你好'}, {'type': 'text', 'text': '请分析下面的数据'}]

5. 实际应用场景

5.1 多模态对话

fromlangchain_core.messagesimportHumanMessage# 构造包含图片和文本的多模态消息message=HumanMessage(content=[{"type":"text","text":"这张图片里有什么?"},{"type":"image_url","image_url":{"url":"https://example.com/photo.jpg"}}])# 发送给支持多模态的模型response=llm.invoke([message])

5.2 流式输出处理

fromlangchain_core.messagesimportAIMessageChunk# 流式输出时,每个 chunk 的 content 可能是部分内容forchunkinllm.stream("讲个笑话"):# 每个 chunk 都是一个 AIMessageChunk# 其 content 可能是字符串或 content_block 列表ifisinstance(chunk.content,list):forblockinchunk.content:ifblock.get("type")=="text":print(block["text"],end="")else:print(chunk.content,end="")

5.3 工具调用场景

fromlangchain_core.messagesimportAIMessage# 模型返回工具调用时,content 可能为空,但 tool_calls 中有内容ai_message=AIMessage(content="",tool_calls=[{"name":"calculator","args":{"expression":"2 + 2"},"id":"call_001"}])# 此时可以通过 content_block 的方式访问fortool_callinai_message.tool_calls:print(f"调用工具:{tool_call['name']}, 参数:{tool_call['args']}")

6. 常见问题与注意事项

6.1 content 为 None 的情况

某些消息(如纯工具调用消息)的content可能为None或空字符串,处理时需要注意判空:

ifmessage.content:# 处理 contentpasselse:# content 为空,可能是工具调用消息pass

6.2 不同模型的兼容性

不同模型对content_block的支持程度不同。OpenAI 支持textimage_url类型,而 Anthropic 使用textimage类型。LangChain 会做自动转换,但自定义时需要注意:

# OpenAI 风格openai_content=[{"type":"text","text":"你好"},{"type":"image_url","image_url":{"url":"..."}}]# Anthropic 风格anthropic_content=[{"type":"text","text":"你好"},{"type":"image","source":{"type":"url","url":"..."}}]

6.3 序列化与反序列化

content_block在存储和传输时会被序列化为 JSON,需要注意保持结构完整:

importjsonfromlangchain_core.messagesimportHumanMessage msg=HumanMessage(content=[{"type":"text","text":"你好"}])# 序列化serialized=msg.model_dump_json()print(serialized)# 反序列化fromlangchain_core.messagesimportmessage_to_dict,messages_from_dict restored=messages_from_dict([json.loads(serialized)])

7. 总结

  • content是消息的顶层内容字段,可以是字符串或结构化列表。
  • content_blockcontent的结构化组成单元,用于表达多模态、多类型内容。
  • content为字符串时,LangChain 内部会将其视为单个文本块。
  • 处理多模态输入、流式输出和工具调用时,理解content_block至关重要。

掌握这两个概念,能帮助你更灵活地构建复杂的对话应用,充分发挥 LangChain 的能力。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/6 14:08:18

Mac上自托管通用上下文层:统一AI工具与自动化脚本的系统状态

这次我们来看一个刚在 Hacker News 上出现的项目:Self-hosted universal context layer for Mac。项目名称已经说得比较清楚,它想在你的 Mac 上自托管一个“通用上下文层”,让本地各种 AI 工具、脚本、自动化流程,都能从一个统一的…

作者头像 李华
网站建设 2026/9/1 3:32:18

开发者PR冲刺指南:6天批量提交与自动化工作流

这次咱们聊的“PR”,不是视频剪辑工具 Premiere,而是开发者语境里的 Pull Request。标题里的“开发者冲击 PR 世界纪录仅剩 6 天”,在开源社区里很常见:某个平台、社区或团队发起一次 PR 提交挑战,要求参与者在限定时间…

作者头像 李华
网站建设 2026/8/31 11:54:26

微信生态AI化落地指南:企业微信、小程序与公众号接入大模型实践

微信AI化已经不是一句口号,而是正在进入公众号、小程序、企业微信和日常开发流程里的真实工程实践。很多团队在尝试把大模型接进微信生态,目标是做智能客服、AI助理、自动内容回复和运营辅助,但真正落地时会发现,难点往往不在模型…

作者头像 李华
网站建设 2026/9/1 11:57:56

数据分析师必学统计学:从描述统计到回归建模的完整路线

很多人入门数据分析时,第一个动作是学 Python、学 SQL、学 Pandas,但做了一两个月项目后,会撞上一堵墙:明明工具都熟,却回答不了业务方的问题。业务方问“这两个版本的活动哪个更好”,你算出了转化率&#…

作者头像 李华
网站建设 2026/9/1 17:01:29

红娘金媒10.3婚恋系统三端源码部署与二次开发实战指南

简介:多端协同的应用架构,正在成为婚恋相亲、本地生活等业务系统的主流形态。PC端承担运营管理、小程序端承载交易闭环、公众号端负责触达沉淀,三端共用一套后端数据与接口体系,核心难点在于会员状态、支付订单、实名认证等关键数…

作者头像 李华
网站建设 2026/9/4 8:22:43

【单片机毕设案例分享】基于 STM32 单片机的阈值自定义智能储物柜体控制系统设计 基于 STM32 的红外人体感应智能柜体环境调控装置设计(013005)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于单片机,STM32单片机,51单片机,J…

作者头像 李华