站点图标 高效码农

AI编程助手数据提取终极指南:从对话到代码的完整采集方案

AI编程助手训练数据提取工具包:从对话到代码的完整采集方案

在机器学习模型训练中,高质量的对话数据和代码交互记录是提升模型性能的关键。无论是训练专属的代码助手,还是分析AI编程工具的使用模式,都需要完整、结构化的原始数据。今天要介绍的这个工具包,正是为解决这一需求而设计——它能自动从主流AI编程助手中提取所有对话、代理操作和代码上下文数据,为模型训练提供坚实的数据源。

一、这个工具包能帮你做什么?

简单来说,这是一套完整的提取工具,能自动发现并采集主流AI编程助手的全部交互数据。无论你使用的是Claude Code、Cursor还是其他编程助手,它都能帮你把隐藏在软件存储中的对话历史“挖”出来,并且整理成便于机器学习训练的格式。

具体能提取哪些内容呢?包括但不限于:

  • 完整的对话记录:用户的提问、AI的回答,一条都不会少
  • 代码上下文信息:涉及的文件路径、具体行数、代码片段
  • 代码差异和修改建议:AI提出的代码修改方案,包括增删改的具体内容
  • 多文件关联信息:当对话涉及多个文件时,能完整保留这种关联关系
  • 工具使用记录:AI调用的各种工具、执行结果
  • 时间戳和元数据:每条信息的产生时间、使用的模型等附加信息

如果你正在准备训练一个代码相关的机器学习模型,或者需要分析AI编程助手的交互模式,这些数据会非常有价值。

二、工具包包含哪些提取脚本?

这个工具包针对不同的AI编程助手,提供了专门的提取脚本,每个脚本都经过优化,能精准识别对应工具的数据存储位置和格式。

1. extract_claude_code.py:提取Claude Code的数据

如果你使用Claude Code或Claude Desktop,这个脚本会帮你找到并提取相关数据。它会自动搜索这些位置:

  • ~/.claude
  • ~/.claude-code
  • ~/.claude-local
  • ~/.claude-m2
  • ~/.claude-zai

Claude的数据通常以JSONL会话文件的形式存储,这个脚本能从中提取出消息内容、工具使用记录、文件上下文和代码差异等信息。

2. extract_codex.py:针对Codex的提取工具

如果你的设备上安装了Codex,运行这个脚本就能提取其数据。它主要搜索:

  • ~/.codex
  • ~/.codex-local

Codex使用Rollout JSONL文件存储数据,脚本会从中提取用户与代理的消息、工具执行结果和代码差异等内容。

3. extract_cursor.py:全面支持Cursor的所有版本

Cursor是很多开发者常用的工具,这个脚本对它的支持最全面,能处理从旧版本到最新版的所有数据格式。它会搜索这些位置:

  • macOS系统:~/Library/Application Support/Cursor
  • 其他系统:对应的应用支持目录

Cursor的数据主要存储在SQLite数据库中,包括state.vscdbcursorDiskKV。无论你使用的是哪种模式的Cursor:

  • 旧版聊天模式(工作区存储)
  • 1.x版本的Composer内置存储(消息在composerData数组中)
  • 1.x到2.0过渡版本的Composer独立存储(消息在bubbleId键中)
  • 2.0以上的最新版Composer/Agent

这个脚本都能提取出代码上下文、选中内容、差异对比、建议修改和代码块,以及工具执行结果和输出。

4. extract_trae.py:提取Trae的交互数据

针对Trae,这个脚本会搜索:

  • ~/.trae
  • ~/Library/Application Support/Trae

Trae的数据存储格式比较灵活,既有JSONL文件,也有SQLite数据库,脚本会统一处理这些格式,提取出聊天记录、代理数据、工具使用情况和代码差异。

5. extract_windsurf.py:处理Windsurf的数据

Windsurf的提取脚本会搜索其应用支持目录(如macOS的~/Library/Application Support/Windsurf),它的数据以类似VSCode的SQLite数据库格式存储,脚本能从中提取聊天记录、代理/流程对话和代码上下文。

6. extract_continue.py:针对Continue AI助手

如果你使用Continue AI助手,这个脚本会搜索~/.continue/sessions/目录,这里存储着JSON格式的会话文件。从中可以提取出用户与助手的消息、工具调用及结果、推理过程、上下文项和工作区信息。

三、如何快速开始使用这些工具?

使用这个工具包不需要安装额外的依赖,因为它只用到了Python 3的标准库。不过你需要确保自己的Python版本是3.6或更高。

第一步:检查Python环境

先确认你的电脑上有合适的Python版本,打开终端或命令提示符,输入:

python3 --version

如果显示的版本是3.6或更高,就可以继续了;如果版本太低,需要先升级Python。

第二步:运行对应的提取脚本

根据你使用的AI编程助手,运行相应的脚本。比如:

  • 提取Claude Code的数据:
python3 extract_claude_code.py
  • 提取Cursor的数据:
python3 extract_cursor.py
  • 提取Codex的数据:
python3 extract_codex.py
  • 提取Trae的数据:
python3 extract_trae.py
  • 提取Windsurf的数据:
python3 extract_windsurf.py

如果你想一次性提取所有支持的工具的数据,可以运行:

./extract_all.sh

第三步:查看提取结果

所有脚本都会在当前目录下创建一个extracted_data/文件夹,提取出的数据会以带时间戳的JSONL文件形式保存在这里。典型的目录结构是这样的:

extracted_data/
├── claude_code_conversations_20250116_143022.jsonl
├── cursor_complete_20250116_143045.jsonl
├── codex_conversations_20250116_143102.jsonl
├── trae_conversations_20250116_143115.jsonl
└── windsurf_conversations_20250116_143130.jsonl

每个文件的名字都包含了对应的工具名称和提取时间,方便你识别和管理。

四、提取出的数据是什么样子的?

提取出的数据采用JSONL格式(即每行一个JSON对象),这种格式既便于处理大量数据,又能保持每条对话的独立性。

一条典型的对话数据长这样:

{
  "messages": [
    {
      "role": "user",
      "content": "How do I fix this TypeScript error?",
      "code_context": [
        {
          "file": "/Users/user/project/src/index.ts",
          "code": "const x: string = 123;",
          "range": {
            "selectionStartLineNumber": 10,
            "positionLineNumber": 10
          }
        }
      ],
      "timestamp": "2025-01-16T14:30:22.123Z"
    },
    {
      "role": "assistant",
      "content": "The error occurs because you're assigning a number to a string type...",
      "suggested_diffs": [...],
      "model": "claude-sonnet-4-5",
      "timestamp": "2025-01-16T14:30:25.456Z"
    }
  ],
  "source": "cursor-composer",
  "name": "TypeScript Type Error Fix",
  "created_at": 1705414222000
}

可以看到,每条对话包含多个消息(messages),每个消息都有明确的角色(role)——是用户(user)还是助手(assistant)。用户消息可能包含code_context,记录了当时讨论的代码片段、所在文件和行数;助手消息可能包含suggested_diffs,即提出的代码修改建议,以及使用的模型(model)信息。

整个对话还有source字段(说明来自哪个工具)、name(对话名称)和created_at(创建时间戳)等元数据,方便后续的筛选和分析。

五、工具包是如何提取数据的?

这些脚本的工作原理可以简单分为六个步骤,通过自动化的流程找到并提取数据:

1. 检测操作系统

首先,脚本会判断你使用的是macOS、Linux还是Windows系统,因为不同系统的文件存储位置有差异。

2. 搜索常见存储位置

根据操作系统,脚本会自动搜索这些常见的应用数据存储目录:

  • macOS:~/Library/Application Support~/.config、用户主目录
  • Linux:~/.config~/.local/share、用户主目录
  • Windows:%APPDATA%%LOCALAPPDATA%、用户主目录

3. 查找目标工具的所有安装

在这些目录中,脚本会寻找目标AI编程助手的安装文件夹,确保不会遗漏任何可能的安装位置。

4. 扫描存储文件

找到工具的安装目录后,脚本会扫描其中的存储文件,包括:

  • SQLite数据库(如.vscdb.db文件)
  • JSONL会话文件
  • 项目特定的目录

5. 提取完整数据

针对不同格式的文件,脚本会采用对应的解析方式,提取出完整的数据,包括对话上下文、代码差异等细节。

6. 保存为结构化的JSONL

最后,所有提取的数据会被整理成统一的JSONL格式,按时间戳命名并保存到extracted_data/目录。

不同工具的存储格式有什么区别?

不同的AI编程助手存储数据的方式各有不同,了解这些差异有助于更好地理解提取过程:

  • Claude Code和Codex:主要使用JSONL文件,每个事件占一行,文件通常位于~/.claude/projects/[项目]/[会话].jsonl或类似路径,采用基于事件的结构,带有类型标记。

  • Cursor(v0.43到v2.0+):使用SQLite数据库,主要有两个位置:

    • 工作区数据:~/Library/Application Support/Cursor/User/workspaceStorage/[哈希]/state.vscdb
    • 全局数据:~/Library/Application Support/Cursor/User/globalStorage/state.vscdb
      数据库中的ItemTable存储聊天记录,cursorDiskKV存储Composer/Agent数据。随着版本更新,其存储结构也在演变,从早期的聊天模式到后来的Composer内置存储,再到过渡版本的独立存储,直至2.0+的最新格式,脚本都能兼容处理。
  • Trae和Windsurf:采用混合格式,既有JSONL文件,也有SQLite数据库,存储结构类似VSCode的扩展数据格式。

六、如何理解提取出的数据?

提取出的数据包含丰富的信息,了解这些信息的含义能帮助你更好地利用它们。

消息角色有哪些?

数据中的role字段主要有两种:

  • user:表示这是人类开发者发送的消息
  • assistant:表示这是AI助手的回复

代码上下文包含哪些信息?

与代码相关的字段能帮你还原当时的开发场景:

  • code_context:包含讨论的文件选中内容和代码片段
  • suggested_diffs:AI提出的代码修改建议
  • tool_use:记录AI调用的代码执行、文件操作等工具
  • tool_results:工具执行的输出结果和应用的差异
  • diff_histories:完整的编辑历史记录

元数据有什么用?

元数据能帮助你对数据进行筛选和分类:

  • source:说明数据来自哪个工具(如“cursor-composer”“claude-code”)
  • session_id/composer_id:对话的唯一标识
  • project_path:当时的工作目录
  • timestamp:消息产生的时间
  • model:使用的AI模型(如果有记录)

七、有哪些高级用法?

除了基本的提取功能,你还可以对提取出的数据进行进一步处理,以适应不同的需求。

如何合并所有提取结果?

如果想把多个工具的提取结果合并到一起,可以用这些命令:

# 合并所有JSONL文件到一个文件
cat extracted_data/*.jsonl > all_conversations.jsonl

# 统计总共有多少条对话
wc -l all_conversations.jsonl

# 按来源统计对话数量
grep -o '"source":"[^"]*"' all_conversations.jsonl | sort | uniq -c

如何按日期筛选对话?

如果只需要某个时间段之后的对话,可以用这段Python代码:

import json
from datetime import datetime

with open('extracted_data/cursor_complete_20250116.jsonl') as f:
    for line in f:
        conv = json.loads(line)
        # 获取创建时间戳,默认为0
        created = conv.get('created_at', 0)
        # 筛选2024年1月1日之后的对话(1704067200000是该日期的时间戳)
        if created > 1704067200000:
            print(json.dumps(conv))

如何只提取包含代码差异的对话?

如果你的训练需求专注于代码修改,可以用这段代码筛选出包含差异的对话:

import json

with open('extracted_data/cursor_complete.jsonl') as f:
    for line in f:
        conv = json.loads(line)
        # 检查是否有消息包含建议的差异或差异历史
        if any('suggested_diffs' in m or 'diff_histories' in m
               for m in conv['messages']):
            print(json.dumps(conv))

八、提取的数据质量如何?

了解提取数据的质量,能帮助你评估其是否符合你的使用需求。

哪些内容能被完整提取?

  • 完整对话:包括用户的提问和AI的回复,多轮对话的上下文也会被完整保留
  • 代码上下文:涉及的文件路径和名称、选中的代码片段、行数范围,以及多文件的关联关系
  • 差异和编辑:AI建议的代码修改、已应用的差异、完整的编辑历史和文件修改记录
  • 元数据:时间戳、项目路径、使用的模型信息、对话名称等

哪些内容可能会缺失?

  • 部分数据:没有AI回复的纯用户消息、已删除或归档的会话、损坏的数据库条目可能无法提取
  • 隐私相关内容:数据中可能包含专有代码、API密钥、个人文件路径等敏感信息,需要后续处理

九、使用提取的数据需要注意哪些隐私和安全问题?

处理提取的数据时,隐私和安全是必须重视的问题,尤其是当这些数据可能包含敏感信息时。

1. 扫描数据中的秘密信息

在使用数据前,建议先扫描其中是否包含API密钥、密码等敏感信息。可以用这个工具:

# 先安装检测工具
pip install detect-secrets
# 扫描所有提取的文件
detect-secrets scan extracted_data/*.jsonl

2. 审查敏感数据

扫描后,需要人工审查:

  • 检查是否有API密钥、密码、令牌等
  • 确认没有暴露专有代码
  • 根据需要清理文件路径中的个人信息

3. 安全存储数据

  • 将数据保存在加密的硬盘上
  • 不要提交到公共代码仓库
  • 建议对备份也进行加密处理

十、提取的数据能用于哪些训练场景?

这些数据最主要的用途是训练机器学习模型,尤其是代码相关的AI助手。

直接用于微调

可以用Hugging Face的datasets库加载数据进行微调:

from datasets import load_dataset

# 加载所有提取的数据
dataset = load_dataset(
    'json',
    data_files='extracted_data/*.jsonl',
    split='train'
)

# 筛选出有AI回复的完整对话
dataset = dataset.filter(
    lambda x: any(m['role'] == 'assistant' for m in x['messages'])
)

与Unsloth结合使用

Unsloth是一个高效的模型训练库,结合提取的数据可以快速训练模型:

from unsloth import FastLanguageModel

# 加载基础模型
model, tokenizer = FastLanguageModel.from_pretrained(
    "unsloth/qwen2.5-coder-7b-instruct",
    max_seq_length=4096,
    load_in_4bit=True,
)

# 格式化对话数据,适配模型的输入格式
def format_chat(example):
    return {
        'text': tokenizer.apply_chat_template(
            example['messages'],
            tokenize=False
        )
    }

# 应用格式化函数
dataset = dataset.map(format_chat)

十一、使用中可能遇到哪些问题?如何解决?

在使用这些工具的过程中,可能会遇到一些常见问题,这里提供对应的解决方法。

问题1:脚本提示“未找到安装”

如果脚本说找不到工具的安装,可能的原因和解决方法:

  1. 确认你确实安装了对应的AI编程助手
  2. 手动检查工具的安装位置,看是否在默认路径外
  3. 可以在脚本的find_XXX_installations()函数中添加自定义路径:
# 在函数中添加一行,指定你的工具安装路径
locations.append(Path("/custom/path/to/tool"))

问题2:提取完成但extracted_data目录为空

这通常是因为没有可提取的历史数据,解决方法:

  1. 确认你确实使用过该工具并有聊天记录
  2. 检查数据是否存储在非标准位置
  3. 可以手动搜索数据库文件:
# 在macOS或Linux上搜索所有可能的数据库文件
find ~ -name "*.vscdb" -o -name "*.db" 2>/dev/null

问题3:出现“数据库已锁定”错误

SQLite数据库在被工具使用时会锁定,解决方法:

  1. 提取前关闭对应的AI工具
  2. 用只读模式连接数据库:
# 修改脚本中的数据库连接代码
conn = sqlite3.connect(f'file:{db_path}?mode=ro', uri=True)

问题4:遇到“权限被拒绝”错误

这是因为脚本没有读取文件的权限,解决方法:

  1. 用适当的权限运行脚本(如需要,在命令前加sudo
  2. 检查文件的所有者,确保当前用户有读取权限
  3. 先将数据库文件复制到有权限的目录,再进行提取

十二、不同操作系统使用时有什么注意事项?

工具包在不同操作系统上的使用略有差异,了解这些能避免很多问题。

macOS系统

  • 大多数工具的数据存储在~/Library/Application Support目录
  • 访问某些系统目录可能需要“全盘访问”权限
  • SQLite数据库通常在~/Library/Application Support/[工具名称]/User/目录下

Linux系统

  • 数据主要存储在~/.config~/.local/share目录
  • 部分工具可能使用~/.local/state目录
  • 如果设置了$XDG_CONFIG_HOME环境变量,工具可能会使用该路径

Windows系统

  • 常用路径是%APPDATA%%LOCALAPPDATA%,对应C:\Users\[用户名]\AppData\Roaming\[工具名称]等位置
  • 访问“Program Files”目录下的文件可能需要管理员权限

十三、工具包支持哪些版本的AI编程助手?

不同版本的AI工具可能会改变数据存储格式,这个工具包对各版本的支持情况如下:

Cursor

  • ✅ v2(0.43及以上):支持Composer/Agent的数据,存储在cursorDiskKV
  • ✅ v1:支持工作区ItemTable中的聊天记录
  • ⚠️ 低于v0.43的版本:格式不同,支持有限

Claude Code

  • ✅ 所有使用JSONL会话文件的版本
  • ✅ 支持基于项目的结构

Codex

  • ✅ 支持Rollout JSONL格式
  • ✅ 支持按时间组织的会话结构

十四、处理大量数据时有什么技巧?

当提取的数据量很大时,需要一些技巧来提高处理效率。

分割大文件

可以将大的JSONL文件分割成小块处理:

# 将文件按每1000行分割成多个文件,前缀为chunk_
split -l 1000 all_conversations.jsonl chunk_

压缩存储

数据文件可以压缩以节省空间:

# 压缩所有提取的JSONL文件
gzip extracted_data/*.jsonl

速度优化

处理大量数据库文件时,可以使用多进程加速:

# 导入多进程模块
from multiprocessing import Pool

# 假设extract_from_db是处理单个数据库的函数,db_files是数据库文件列表
with Pool() as pool:
    results = pool.map(extract_from_db, db_files)

十五、如何为这个工具包做贡献?

如果你发现了新的AI编程助手,或者现有工具的存储格式有了更新,欢迎贡献代码:

  1. 遵循现有脚本的结构
  2. 添加自动发现工具安装位置的逻辑
  3. 确保能提取完整的数据(消息、上下文、差异等)
  4. 将输出格式统一为JSONL
  5. 更新说明文档

十六、许可与免责声明

这个工具包使用MIT许可证,你可以自由使用它来训练机器学习模型。

但需要注意:这个工具包提取的是你自己设备上的本地数据,你需要对这些数据负责:

  • 确保你有权限提取和使用这些数据
  • 妥善处理敏感信息和专有内容
  • 遵守相关工具的服务条款
  • 在分享或用于训练前,务必扫描并清理其中的秘密信息

常见问题解答(FAQ)

这个工具包需要安装额外的依赖吗?

不需要,它只使用Python 3的标准库,只要你的Python版本是3.6或更高,就可以直接运行。

提取的数据可以用于商业模型训练吗?

这取决于你提取的数据内容和相关工具的服务条款。你需要确保自己拥有数据的使用权,并且不侵犯任何第三方权益。

为什么提取的对话中没有代码差异?

可能有两个原因:一是该对话本身没有涉及代码修改,二是工具的某些版本不记录代码差异。你可以检查工具的版本是否在支持列表中,或手动查看原始存储文件确认。

可以同时提取多个工具的数据吗?

可以,运行./extract_all.sh脚本就能一次性提取所有支持的工具的数据。

提取的数据中包含的文件路径是真实的吗?

是的,数据会保留原始的文件路径信息。如果需要保护隐私,可以在使用前对这些路径进行匿名化处理。

工具包会修改原始数据吗?

不会,所有提取操作都是只读的,不会修改AI工具的原始存储文件,你可以放心使用。

通过这个工具包,你可以系统地收集和整理AI编程助手的交互数据,为模型训练提供高质量的素材。无论是研究还是实际应用,这些结构化的数据都能帮你更高效地实现目标。

退出移动版