Skip to content

ChatLLM 对话模型

ChatLLM 是专门为对话式场景设计的 LLM 抽象类,适合多轮对话、工具调用、知识问答等场景。主流模型如 GPT、Claude、Gemini 等都属于 ChatLLM 类型。

设计理念

为什么需要 ChatLLM

虽然 BaseLLM 提供了基础功能,但对话场景有特殊需求:

  1. 消息历史管理:需要维护多轮对话的历史记录
  2. Prompt 位置精确控制:系统消息、用户输入、中间结果需要插入不同位置
  3. 工具调用集成:需要将工具描述和工具调用结果正确地融入对话流
  4. 多模态对话:支持图片、视频等富媒体输入
  5. 输入格式化:有时需要重新格式化用户输入(如提取关键信息)

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)

相关文档