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.vscdb和cursorDiskKV。无论你使用的是哪种模式的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:脚本提示“未找到安装”
如果脚本说找不到工具的安装,可能的原因和解决方法:
-
确认你确实安装了对应的AI编程助手 -
手动检查工具的安装位置,看是否在默认路径外 -
可以在脚本的 find_XXX_installations()函数中添加自定义路径:
# 在函数中添加一行,指定你的工具安装路径
locations.append(Path("/custom/path/to/tool"))
问题2:提取完成但extracted_data目录为空
这通常是因为没有可提取的历史数据,解决方法:
-
确认你确实使用过该工具并有聊天记录 -
检查数据是否存储在非标准位置 -
可以手动搜索数据库文件:
# 在macOS或Linux上搜索所有可能的数据库文件
find ~ -name "*.vscdb" -o -name "*.db" 2>/dev/null
问题3:出现“数据库已锁定”错误
SQLite数据库在被工具使用时会锁定,解决方法:
-
提取前关闭对应的AI工具 -
用只读模式连接数据库:
# 修改脚本中的数据库连接代码
conn = sqlite3.connect(f'file:{db_path}?mode=ro', uri=True)
问题4:遇到“权限被拒绝”错误
这是因为脚本没有读取文件的权限,解决方法:
-
用适当的权限运行脚本(如需要,在命令前加 sudo) -
检查文件的所有者,确保当前用户有读取权限 -
先将数据库文件复制到有权限的目录,再进行提取
十二、不同操作系统使用时有什么注意事项?
工具包在不同操作系统上的使用略有差异,了解这些能避免很多问题。
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编程助手,或者现有工具的存储格式有了更新,欢迎贡献代码:
-
遵循现有脚本的结构 -
添加自动发现工具安装位置的逻辑 -
确保能提取完整的数据(消息、上下文、差异等) -
将输出格式统一为JSONL -
更新说明文档
十六、许可与免责声明
这个工具包使用MIT许可证,你可以自由使用它来训练机器学习模型。
但需要注意:这个工具包提取的是你自己设备上的本地数据,你需要对这些数据负责:
-
确保你有权限提取和使用这些数据 -
妥善处理敏感信息和专有内容 -
遵守相关工具的服务条款 -
在分享或用于训练前,务必扫描并清理其中的秘密信息
常见问题解答(FAQ)
这个工具包需要安装额外的依赖吗?
不需要,它只使用Python 3的标准库,只要你的Python版本是3.6或更高,就可以直接运行。
提取的数据可以用于商业模型训练吗?
这取决于你提取的数据内容和相关工具的服务条款。你需要确保自己拥有数据的使用权,并且不侵犯任何第三方权益。
为什么提取的对话中没有代码差异?
可能有两个原因:一是该对话本身没有涉及代码修改,二是工具的某些版本不记录代码差异。你可以检查工具的版本是否在支持列表中,或手动查看原始存储文件确认。
可以同时提取多个工具的数据吗?
可以,运行./extract_all.sh脚本就能一次性提取所有支持的工具的数据。
提取的数据中包含的文件路径是真实的吗?
是的,数据会保留原始的文件路径信息。如果需要保护隐私,可以在使用前对这些路径进行匿名化处理。
工具包会修改原始数据吗?
不会,所有提取操作都是只读的,不会修改AI工具的原始存储文件,你可以放心使用。
通过这个工具包,你可以系统地收集和整理AI编程助手的交互数据,为模型训练提供高质量的素材。无论是研究还是实际应用,这些结构化的数据都能帮你更高效地实现目标。

