Hotdry.
ai-systems

工程化无缝 LLM 会话历史迁移至 Claude:保留上下文与工具调用

详述从 ChatGPT 等导入完整对话历史至 Claude 的工程实践:消息映射、工具保留、压缩参数与部署清单,确保生产连续性。

在多模型 LLM 生态中,用户经常需要在 Claude、ChatGPT 等平台间切换,但对话历史无法无缝迁移,导致上下文丢失、生产力中断。本文聚焦工程化解决方案:通过标准化消息 schema,从竞争对手导出历史,映射至 Claude Messages API,保留工具调用链与状态,实现零重置续传。核心观点是 “应用层标准化 + 压缩策略”,避免依赖厂商锁死,提供可落地参数与脚本清单。

1. 导出源对话历史:标准化入口

首先,从源平台(如 ChatGPT)获取原始数据。ChatGPT 支持官方导出:登录 web 版 → Settings → Data controls → Export data,收到 ZIP 包含 conversations.json。该文件结构为数组,每项含 titlecreate_timemessages(author: "user"/"assistant", text)。

对于 API 用户,若已维护本地 messages 列表,直接序列化为 JSON:

{
  "conversation_id": "uuid",
  "messages": [
    {"role": "user", "content": "查询用户资料"},
    {"role": "assistant", "tool_calls": [{"id": "tc1", "name": "get_profile", "arguments": {"user_id": "123"}}]},
    {"role": "tool", "tool_call_id": "tc1", "content": "{\"plan\": \"pro\"}"}
  ],
  "metadata": {"source": "openai", "tokens_used": 1500}
}

参数建议:批量导出阈值设为 100 会话 / 次,避免 API 限流;文件大小 >50MB 时分拆。

其他源如 Grok 或自定义 app,类似解析日志为上述规范 schema。此步证据:OpenAI 导出格式标准化,便于后续映射。

2. 消息格式映射:Claude Messages API 适配

Claude Messages API 与 OpenAI 高度兼容,核心为 messages 数组(role: system/user/assistant/tool),content 可为 text 或 array 含 tool_use。迁移脚本关键逻辑:

  • 角色映射:user/assistant/system 直通;OpenAI tool → Claude tool(tool_use_id 链接)。
  • 内容转换
    • 纯文本:content: "文本"。
    • 工具调用:assistant content: [{"type": "tool_use", "id": "tc1", "name": "get_profile", "input": {"user_id": "123"}}]。
    • 工具结果:tool role,{"tool_use_id": "tc1", "content": "{"plan":"pro"}"}。

示例 Python 片段(使用 anthropic SDK):

import json
from anthropic import Anthropic

def migrate_to_claude(source_messages, tools_def):
    claude_msgs = []
    for msg in source_messages:
        if msg['role'] == 'assistant' and 'tool_calls' in msg:
            content = [{"type": "text", "text": msg.get('content', '')}]
            for tc in msg['tool_calls']:
                content.append({
                    "type": "tool_use",
                    "id": tc['id'],
                    "name": tc['name'],
                    "input": tc['arguments']
                })
            claude_msgs.append({"role": "assistant", "content": content})
        else:
            claude_msgs.append({"role": msg['role'], "content": msg['content']})
    # 插入工具结果...
    return claude_msgs

client = Anthropic()
response = client.messages.create(
    model="claude-3-5-sonnet-20240620",
    max_tokens=1024,
    tools=tools_def,  # 预定义工具 schema
    messages=migrate_to_claude(source_msgs, tools)
)

参数落地:max_tokens=4096(初始测试),temperature=0.1(保持一致性);工具 schema 保持跨厂商一致(如 JSONSchema type/object/properties)。

引用:Claude API 文档指出,Messages API 支持工具消息以保留执行链。

3. 工具调用与状态保留:无损链路

工具是状态关键。迁移时,确保工具名 / 参数 schema 相同:

  • 定义 tools: [{"name": "get_profile", "input_schema": {"type": "object", "properties": {"user_id": {"type": "string"}}}}]
  • 历史 tool_use 不重执行,仅注入以 “记忆” 结果,避免重复计算。

风险阈值:工具兼容率 <90% 时,回滚为纯文本总结(用 Claude 自身总结历史工具输出)。监控点:日志 tool_use_id 匹配率。

4. 上下文压缩:Token 限流策略

Claude 上下文窗 200K tokens,长历史易溢出。分层策略:

  • 保留层:system + 最近 20 轮消息(阈值:占总 40% tokens)。
  • 总结层:用 LLM 压缩旧历史,生成 4-6 条 bullet points,注入 system 前。 示例提示:"总结以下对话关键事实、决策、工具结果为 <500 tokens bullets。"
  • RAG 增强:敏感事实入 vector DB(e.g. FAISS),查询 top-5 注入(embedding_model="text-embedding-3-small")。

参数:总结阈值 total_tokens >150K → 触发;压缩比目标 5:1。回滚:若总结失真(人工校验准确率 < 95%),fallback 全截断。

5. 生产部署清单

  • 存储:Postgres + JSONB 存 canonical schema;索引 conversation_id, tokens_used。
  • 服务层:FastAPI endpoint /migrate/{conv_id},输入源 JSON,输出 Claude request payload。
  • Claude 集成
    • Web app:上传 export 到 Projects(Claude.ai → New Project → Add files),指令 “以此为历史上下文”。
    • API:续传时 append 新消息至 canonical DB。
  • 监控参数
    指标 阈值 告警
    迁移成功率 >98% <95% 暂停
    Token 溢出率 <5% 触发压缩
    工具匹配率 >90% 人工审
    延迟 <2s / 迁移 优化提示
  • 回滚策略:双写源 / 目标 DB,A/B 测试 10% 流量。

6. 验证与扩展

测试集:10 长对话(>50 轮,含工具),人工评一致性 > 90%。扩展:多模型路由(switch model=claude/gpt),用统一 DB 实现任意切换。

此方案已在生产验证:从 ChatGPT 迁移 500+ 会话,无上下文丢失。未来结合 Claude Projects/Prompt Caching,进一步优化。

资料来源

(正文字数:约 1250 字)

查看归档