ChatLLM 对话模型¶
ChatLLM 是专门为对话式场景设计的 LLM 抽象类,适合多轮对话、工具调用、知识问答等场景。主流模型如 GPT、Claude、Gemini 等都属于 ChatLLM 类型。
设计理念¶
为什么需要 ChatLLM¶
虽然 BaseLLM 提供了基础功能,但对话场景有特殊需求:
- 消息历史管理:需要维护多轮对话的历史记录
- Prompt 位置精确控制:系统消息、用户输入、中间结果需要插入不同位置
- 工具调用集成:需要将工具描述和工具调用结果正确地融入对话流
- 多模态对话:支持图片、视频等富媒体输入
- 输入格式化:有时需要重新格式化用户输入(如提取关键信息)
ChatLLM 在 BaseLLM 基础上,针对这些需求进行了专门设计。
与 GenerationLLM 的区别¶
| 特性 | ChatLLM | GenerationLLM |
|---|---|---|
| 主要用途 | 多轮对话、工具调用 | 连续文本生成 |
| 响应格式 | 支持结构化(JSON/工具调用) | 仅纯文本 |
| 典型场景 | QA、代码助手、数据分析 | DSL 生成、代码编辑 |
| 消息结构 | 支持多角色(user/assistant/system/tool) | 简化的输入输出 |
核心概念¶
Prompt 位置系统¶
ChatLLM 提供了 5 个精确的 Prompt 插入位置,用于构建复杂的对话上下文:
最终消息顺序:
┌──────────────────────────────────────┐
│ 1. system_msg_prompt │ ← 所有消息顶部
├──────────────────────────────────────┤
│ 2. conversation_msgs │ ← 历史对话
├──────────────────────────────────────┤
│ 3. before_input_msg_prompt │ ← 当前输入前
├──────────────────────────────────────┤
│ 4. input_msg (或 reformat 后的) │ ← 当前输入
├──────────────────────────────────────┤
│ 5. after_input_msg_prompt │ ← 当前输入后
├──────────────────────────────────────┤
│ 6. intermediate_msgs │ ← 工具调用中间结果
├──────────────────────────────────────┤
│ 7. after_intermediate_msg_prompt │ ← 中间消息后
└──────────────────────────────────────┘
各位置的使用场景¶
1. system_msg_prompt¶
用途:定义系统角色、全局规则、工具列表
from tfrobot.brain.chain.llms import GPT
from tfrobot.brain.chain.prompt.knowledge_prompt import KnowledgePrompt
from tfrobot.brain.chain.prompt.memo_prompt import MemoPrompt
from tfrobot.brain.chain.prompt.template.jinja2_template import Jinja2PromptTemplate
from tfrobot.brain.chain.prompt.tool_prompt import ToolPrompt
from tfrobot.schema.types import Locale
llm = GPT(name="gpt-4o")
llm.system_msg_prompt = [
MemoPrompt(template=Jinja2PromptTemplate(templates={Locale.DEFAULT: "你是一个专业的代码助手,擅长 Python 开发。"})),
ToolPrompt(), # 自动生成工具描述
KnowledgePrompt(), # 自动注入知识库
]
2. before_input_msg_prompt¶
用途:提供任务背景、上下文说明
from tfrobot.brain.chain.llms import GPT
from tfrobot.brain.chain.prompt.memo_prompt import MemoPrompt
from tfrobot.brain.chain.prompt.template.jinja2_template import Jinja2PromptTemplate
from tfrobot.schema.types import Locale
llm = GPT(name="gpt-4o")
llm.before_input_msg_prompt = [
MemoPrompt(
template=Jinja2PromptTemplate(templates={Locale.DEFAULT: "当前项目是一个 Web 框架,使用 FastAPI 开发。"})
),
]
3. after_input_msg_prompt¶
用途:约束输出格式、添加额外要求
from tfrobot.brain.chain.llms import GPT
from tfrobot.brain.chain.prompt.memo_prompt import MemoPrompt
from tfrobot.brain.chain.prompt.template.jinja2_template import Jinja2PromptTemplate
from tfrobot.schema.types import Locale
llm = GPT(name="gpt-4o")
llm.after_input_msg_prompt = [
MemoPrompt(template=Jinja2PromptTemplate(templates={Locale.DEFAULT: "请使用 Markdown 格式回复,代码块标明语言。"})),
]
4. after_intermediate_msg_prompt¶
用途:引导工具调用后的下一步行动
from tfrobot.brain.chain.llms import GPT
from tfrobot.brain.chain.prompt.memo_prompt import MemoPrompt
from tfrobot.brain.chain.prompt.template.jinja2_template import Jinja2PromptTemplate
from tfrobot.schema.types import Locale
llm = GPT(name="gpt-4o")
llm.after_intermediate_msg_prompt = [
MemoPrompt(template=Jinja2PromptTemplate(templates={Locale.DEFAULT: "请根据工具返回结果,继续完成任务。"})),
]
5. reformat_input_prompt¶
用途:转换、预处理用户输入
from tfrobot.brain.chain.llms import GPT
from tfrobot.brain.chain.prompt.memo_prompt import MemoPrompt
from tfrobot.brain.chain.prompt.template.jinja2_template import Jinja2PromptTemplate
from tfrobot.schema.types import Locale
llm = GPT(name="gpt-4o")
# 使用 MemoPrompt 实现输入重新格式化
llm.reformat_input_prompt = [
MemoPrompt(template=Jinja2PromptTemplate(templates={Locale.DEFAULT: "用户问题:{{ user_input.input }}"}))
]
消息格式化流程¶
ChatLLM 的核心方法 format_to_request_msgs 负责将各种 Prompt 和消息组合成最终的 LLM 请求消息序列。
该方法接收当前输入和提示上下文,返回格式化后的请求消息列表。处理流程包括渲染各位置 Prompt、转换历史消息、处理中间消息等步骤。
处理流程:
PromptContext (工具、知识、文档等)
↓
┌─────────────────────────────────────┐
│ 1. 渲染 system_msg_prompt │ → LLMSystemMessage
├─────────────────────────────────────┤
│ 2. 处理 conversation_msgs │ → 转换为 LLM 格式
│ - 调用 to_llm_request(use_summary=True) │
│ - 支持摘要模式(减少 token) │
├─────────────────────────────────────┤
│ 3. 渲染 before_input_msg_prompt │ → LLMSystemMessage
├─────────────────────────────────────┤
│ 4. 处理 input_msg │ → LLMUserMessage
│ - 如果有 reformat_input_prompt │ → 使用 Prompt 生成的内容
│ - 否则使用 current_input.to_llm_request() │
├─────────────────────────────────────┤
│ 5. 渲染 after_input_msg_prompt │ → LLMSystemMessage
├─────────────────────────────────────┤
│ 6. 处理 intermediate_msgs │ → 转换为 LLM 格式
│ - 最后一条不使用摘要 │
│ - 其他使用摘要 │
├─────────────────────────────────────┤
│ 7. 渲染 after_intermediate_msg_prompt │ → LLMSystemMessage
└─────────────────────────────────────┘
↓
ReqeustMsgs (结构化消息容器)
↓
to_list() → list[BaseLLMMessage]
配置参数¶
核心参数¶
| 参数 | 类型 | 说明 | 默认值 |
|---|---|---|---|
system_msg_prompt |
list[BasePrompt] |
系统消息提示列表 | [] |
before_input_msg_prompt |
list[BasePrompt] |
用户输入前提示列表 | [] |
after_input_msg_prompt |
list[BasePrompt] |
用户输入后提示列表 | [] |
after_intermediate_msg_prompt |
list[BasePrompt] |
中间消息后提示列表 | [] |
reformat_input_prompt |
list[BasePrompt] |
重新格式化输入提示列表 | [] |
工具提示配置¶
from tfrobot.brain.chain.llms import GPT
from tfrobot.brain.chain.prompt.dsl_prompt import DSLToolPrompt
from tfrobot.brain.chain.prompt.tool_prompt import ToolPrompt
llm = GPT(name="gpt-4o")
# 原生模式(支持 Function Calling 的模型)
llm.system_msg_prompt.append(ToolPrompt()) # 自动生成 OpenAI 格式工具描述
# DSL 模式(不支持工具调用的模型)
llm.system_msg_prompt.append(DSLToolPrompt()) # 生成 DSL 语法描述
知识库配置¶
from tfrobot.brain.chain.llms import GPT
from tfrobot.brain.chain.prompt.knowledge_prompt import KnowledgePrompt
from tfrobot.brain.chain.prompt.template.f_string_template import FStrPromptTemplate
from tfrobot.schema.types import Locale
llm = GPT(name="gpt-4o")
llm.system_msg_prompt.append(
KnowledgePrompt(template=FStrPromptTemplate(templates={Locale.DEFAULT: "相关资料:\n{knowledge.knowledge}"}))
)
使用示例¶
基础对话¶
from tfrobot.brain.chain.llms import GPT
from tfrobot.schema.message.conversation.message_dto import TextMessage
from tfrobot.schema.users import BaseUser
# 创建模型
llm = GPT(name="gpt-4o")
# 构建用户输入
user_input = TextMessage(role="user", creator=BaseUser(name="User", uid="1"), content="你好,请介绍一下 TFRobot 项目。")
# 调用模型
result = llm.complete(current_input=user_input)
print(result.generations[0].text)
"""
TFRobot 是一个开源项目,主要关注通过机器人技术实现人工智能应用和自动化解决方案。该项目可能包括硬件平台、控制算法、传感和感知模块,以及软件开发工具包(SDK)。由于你提到的项目信息相对少,我将根据一般理解为你整理如下内容。
如果 TFRobot 是你所指的一个特定的、已经发布的开源硬件或软件平台,这类项目通常具有以下几个特点:
### 1. **平台特点**
- **模块化设计**:TFRobot 应该包含各类可扩展的硬件或软件模块,例如传感器、控制器等,方便开发者快速组装和创建原型。
- **开放源代码**:项目可能基于 GitHub 或其他代码托管平台发布,支持开发者自行扩展和二次开发。
- **支持多种开发语言和工具**:支持 Python、C++、ROS(机器人操作系统)或其他常用语言和框架,适应不同开发者的需求。
- **低门槛的学习平台**:通常这类项目为了推广机器人技术和 AI 会设计适合初学者的学习材料、教程和案例。
- **教育与研究结合**:TFRobot 也可能注重分布式教育用途,结合机器人和 AI 培训,让更多学生和研究者受益。
### 2. **可能实现的功能**
- **导航和定位**:开发机器人导航算法,比如基于激光雷达(Lidar)实现的 SLAM(同步定位与建图)。
- **计算机视觉集成**:可能强调图像识别技术,以供开发者使用摄像头完成物体检测、人脸识别、目标跟踪等任务。
- **机械手臂**:支持多轴机械臂,用于处理精细操作任务,如工业生产和仓储管理。
- **多种设备通信**:支持多种通信协议(如 UART、I2C、SPI),实现与传感设备和控制模块的交互。
- **物联网功能**:与云端连接,通过互联网实现远程监控和控制,甚至集成基于人工智能的云服务。
### 3. **适用领域**
- **教育用途**:供学生和科技爱好者学习机器人系统基础知识。
- **研究开发**:面向高校研究实验室以及商用研发机构,用于原型开发与学术研究。
- **工业应用**:如果具有高精度组件,可能支持物流、监控、制造等领域中的自动化任务。
- **家庭服务机器人**:应用在智能家居的自动化领域,比如家务辅助手、问答机器人等。
### 4. **获取资源**
如果你正在尝试寻找 TFRobot 资料,可以:
- 检查项目在 GitHub 的代码仓库。
- 浏览官方文档或社区文章,其中可能包含如何搭建硬件平台、设置软件库以及运行示例程序的详细步骤。
- 查看是否有 TFRobot 的开发者论坛或社交媒体社区,比如 Discord、Reddit 或 Facebook 群组。
如果你指的是一个更具体的机构或项目名称,可以提供更多的细节,我将为你查找更精准的建议和信息!
"""
配置系统提示词¶
from tfrobot.brain.chain.llms import Claude
from tfrobot.brain.chain.prompt.memo_prompt import MemoPrompt
from tfrobot.brain.chain.prompt.template.jinja2_template import Jinja2PromptTemplate
from tfrobot.schema.message.conversation.message_dto import TextMessage
from tfrobot.schema.types import Locale
from tfrobot.schema.users import BaseUser
llm = Claude(name="claude-3-5-sonnet-20241022")
# 配置系统提示词
llm.system_msg_prompt = [
MemoPrompt(
template=Jinja2PromptTemplate(
templates={
Locale.ZH: "你是一个专业的 Python 开发助手,擅长代码调试和性能优化。",
Locale.EN: "You are a professional Python developer assistant, skilled in code debugging and performance optimization.",
}
)
)
]
user_input = TextMessage(role="user", creator=BaseUser(name="User", uid="1"), content="你好")
result = llm.complete(current_input=user_input)
工具调用¶
from tfrobot.brain.chain.llms import GPT
from tfrobot.brain.chain.prompt.tool_prompt import ToolPrompt
from tfrobot.drive.tool.tool import tool
from tfrobot.schema.message.conversation.message_dto import TextMessage
from tfrobot.schema.users import BaseUser
@tool
def calculate(expression: str) -> str:
"""计算数学表达式"""
try:
return str(eval(expression))
except Exception as e:
return f"Error: {str(e)}"
llm = GPT(name="gpt-4o")
llm.system_msg_prompt = [ToolPrompt()]
result = llm.complete(
current_input=TextMessage(content="计算 123 * 456 的结果", creator=BaseUser(name="User", uid="1")),
tools=[calculate],
)
多轮对话¶
from tfrobot.brain.chain.llms import Claude
from tfrobot.schema.message.conversation.message_dto import TextMessage
from tfrobot.schema.users import BaseUser
llm = Claude(name="claude-3-5-sonnet-20241022")
user = BaseUser(name="User", uid="1")
# 第一轮对话
msg1 = TextMessage(content="什么是 FastAPI?", creator=user)
result1 = llm.complete(current_input=msg1)
print(result1.generations[0].text)