文章目录
- 第6章 Message消息体系详解
- 6.1 为什么需要Message
- 6.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 手动创建AIMessage
- 6.4.3 包含工具调用的AIMessage
- 6.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章 提示词模板PromptTemplate
- 7.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 为什么需要MessagesPlaceholder
- 7.3.2 MessagesPlaceholder的参数
- 7.4 模板的部分格式化
- 7.4.1 partial的使用
- 7.4.2 用函数做partial(动态值)
- 7.5 提示词模板的组合与管道
- 7.5.1 最简单的链:Prompt + Model
- 7.5.2 加上输出解析器
- 7.5.3 管道的原理
- 7.6 提示词工程最佳实践
- 7.6.1 写好System Prompt
- 7.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 FewShotChatMessagePromptTemplate
- 7.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类而不是@tool
- 8.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 Key
- 8.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 为什么用LCEL
- 10.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 Template
- Tool定义
- 结构化输出
- LCEL管道
第6章 Message消息体系详解
在第一篇中,我们学会了如何初始化模型并发送消息。但是我们之前只是简单地传入一个字符串,LangChain内部是如何表示对话消息的呢?这一章我们将深入学习LangChain的Message消息体系,这是整个框架最基础也是最重要的概念之一。
6.1 为什么需要Message
我们先想一个问题:为什么不能简单地用字符串列表来表示对话历史?比如:
# 这是我们可能想到的简单方式,但这是不够的history=["你好,我叫小明","你好小明!有什么可以帮你的吗?","我今天心情不太好",]