文章目录第6章 Message消息体系详解6.1 为什么需要Message6.2 LangChain中的Message类型6.3 HumanMessage用户消息6.3.1 基本使用6.3.2 发送HumanMessage给模型6.3.3 HumanMessage的其他属性6.4 AIMessage AI回复消息6.4.1 AIMessage的结构6.4.2 手动创建AIMessage6.4.3 包含工具调用的AIMessage6.5 SystemMessage系统消息6.5.1 SystemMessage的基本使用6.5.2 SystemMessage放在哪里6.5.3 SystemMessage的最佳实践6.5.4 SystemMessage vs 放在用户消息里的指令6.6 其他特殊Message类型6.6.1 ToolMessage工具消息6.6.2 FunctionMessage(已过时)6.6.3 ChatMessage通用消息6.7 Message列表与多轮对话6.7.1 手动构建多轮对话6.7.2 消息历史的裁剪问题6.7.3 查看消息内容6.8 Message内容的多模态支持6.8.1 发送图片消息第7章 提示词模板PromptTemplate7.1 为什么需要提示词模板7.2 ChatPromptTemplate聊天提示词模板7.2.1 从模板字符串创建7.2.2 支持的role类型7.2.3 和模型链式调用7.2.4 from_template:单条消息模板7.3 MessagesPlaceholder消息占位符7.3.1 为什么需要MessagesPlaceholder7.3.2 MessagesPlaceholder的参数7.4 模板的部分格式化7.4.1 partial的使用7.4.2 用函数做partial(动态值)7.5 提示词模板的组合与管道7.5.1 最简单的链:Prompt + Model7.5.2 加上输出解析器7.5.3 管道的原理7.6 提示词工程最佳实践7.6.1 写好System Prompt7.6.2 思维链(Chain of Thought, CoT)7.6.3 提供示例(Few-shot Learning)7.6.4 指定输出格式7.6.5 提示词要迭代优化7.7 Few-shot少样本学习模板7.7.1 FewShotChatMessagePromptTemplate7.7.2 动态选择示例第8章 Tools工具系统8.1 为什么需要工具8.2 使用@tool装饰器定义工具8.2.1 第一个工具:计算器8.2.2 @tool装饰器的参数8.2.3 带多个参数的工具8.3 使用Tool类手动定义工具8.3.1 Tool类基本使用8.3.2 什么时候用Tool类而不是@tool8.3.3 StructuredTool:多参数工具8.4 工具的参数Schema定义8.4.1 使用Pydantic定义Schema(推荐)8.4.2 为什么参数描述很重要8.5 工具的绑定与调用8.5.1 bind_tools绑定工具8.5.2 调用带工具的模型8.5.3 执行工具并返回结果8.5.4 多个工具同时绑定8.6 内置工具介绍与使用8.6.1 查看可用的内置工具8.7 Tavily联网搜索工具集成8.7.1 注册Tavily获取API Key8.7.2 安装依赖并配置8.7.3 使用TavilySearchResults工具8.7.4 把搜索工具绑定给模型8.8 自定义工具的高级技巧8.8.1 工具错误处理8.8.2 工具返回结果要简洁8.8.3 工具的同步和异步第9章 结构化输出9.1 为什么需要结构化输出9.2.2 Pydantic模型的基本使用9.3 with_structured_output方法9.3.1 基本使用9.3.2 返回字典而不是Pydantic对象9.3.3 include_raw=True查看原始响应9.4 嵌套结构与复杂类型处理9.4.1 嵌套结构示例9.4.2 支持的类型9.5 枚举类型与字段验证9.5.1 使用Enum限制字段值范围9.5.2 字段验证规则9.6 结构化输出的常见问题与解决方案9.6.1 模型返回的结果不符合Schema怎么办9.6.2 模型总是漏掉可选字段9.7 实战:结构化信息提取第10章 Runnable接口与LCEL表达式10.1 Runnable接口概述10.2 LCEL链式表达式基础10.2.1 最简单的链10.2.2 为什么用LCEL10.3 管道操作符的使用10.3.1 管道的本质10.3.2 输入输出类型要匹配10.4 并行执行与分支10.4.1 RunnableParallel:并行执行多个组件10.4.2 RunnablePassthrough:数据透传10.5 自定义Runnable组件第11章 核心组件综合实战项目11.1 智能客服机器人11.2 简历信息提取系统11.3 数学计算助手附录C:核心组件API速查表Message类型Prompt TemplateTool定义结构化输出LCEL管道第6章 Message消息体系详解在第一篇中,我们学会了如何初始化模型并发送消息。但是我们之前只是简单地传入一个字符串,LangChain内部是如何表示对话消息的呢?这一章我们将深入学习LangChain的Message消息体系,这是整个框架最基础也是最重要的概念之一。6.1 为什么需要Message我们先想一个问题:为什么不能简单地用字符串列表来表示对话历史?比如:# 这是我们可能想到的简单方式,但这是不够的history=["你好,我叫小明","你好小明!有什么可以帮你的吗?","我今天心情不太好",]