DeepSeek網頁版在左下角個人信息/系統設置的賬號管理頁簽中有個“導出所有歷史對話”功能,點擊“導出”,片刻就能生成一個deepseek_data-2025-06-14.zip
的文件,里面有2個json文件,直接用文本編輯器查看不太方便。
而用DuckDB查詢卻很方便。
一開始,我們不知道這個json包括哪些字段,輸入:
D select * from 'conv.json' limit 1;
┌──────────────────────┬──────────────────────┬──────────────────────┬──────────────────────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ id │ title │ inserted_at │ updated_at │ mapping │
│ uuid │ varchar │ varchar │ varchar │ struct(root struct(id varchar, parent json, children varchar[], message json), "1" struct(id varchar, parent va… │
├──────────────────────┼──────────────────────┼──────────────────────┼──────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ e6535268-e25a-4620… │ 麻將胡牌判斷函數實現 │ 2025-01-23T14:10:3… │ 2025-01-23T14:48:2… │ {'root': {'id': root, 'parent': NULL, 'children': [1], 'message': NULL}, '1': {'id': 1, 'parent': root, 'childr… │
└──────────────────────┴──────────────────────┴──────────────────────┴──────────────────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
可見,這個文件有5個字段,對話信息保存在mapping中,其他都是它的屬性信息,標題,建立和更新時間,還有uuid。
為了看起來方便,我們設置輸出模式為list, 這樣就能顯示mapping的全部內容,而不會被截斷,我們看到mapping中的各個字段,有我們的問話和deepseek的回答。
D .mode list
D select mapping from 'conv.json' limit 1;
mapping
{'root': {'id': root, 'parent': NULL, 'children': [1], 'message': NULL}, '1': {'id': 1, 'parent': root, 'children':
[2], 'message': {'files': [], 'search_results': NULL, 'model': deepseek-chat, 'reasoning_content': NULL,
'content': 請給出一個函數,輸入是長度為14的unicode的麻將字符串,返回是否胡牌的布爾值, 'inserted_at': '2025-01-23T14:10:32.372143+00:00'}}, '2': {'id': 2, 'parent': 1, 'children': [4],
'message': {'files': [], 'search_results': NULL, 'model': deepseek-chat, 'reasoning_content': NULL,
'content': '要判斷一個長度為14的Unicode字符串是否表示一副胡牌的麻將牌型,我們需要遵循麻將的基本規則。通常,胡牌的牌型由4個順子或刻子(每組3張牌)加上一對將牌組成。以下是Python代碼實現:`` `python
def is_winning_hand(hand):from collections import defaultdictif len(hand) != 14:return False
一般情況下,這樣輸出已經足夠了,對話中的換行也從json文件中的轉義符\n轉換成了實際換行,很便于閱讀。
而如果歷史記錄很多,也可以根據標題和時間進行篩選,這時,我把它切回box模式
D .mode box
D select title, inserted_at from 'conv.json' where inserted_at::date between date'2025-06-01' and date'2025-06-15' and title like'%DuckDB%';
┌──────────────────────────────────────────────────┬──────────────────────────────────┐
│ title │ inserted_at │
├──────────────────────────────────────────────────┼──────────────────────────────────┤
│ DuckDB PostgreSQL查詢功能實現分析 │ 2025-06-01T06:12:58.998000+08:00 │
│ DuckDB實現XLS讀取功能 │ 2025-06-08T12:23:09.081000+08:00 │
│ DuckDB查詢結果導出XLS實現 │ 2025-06-08T22:36:21.605000+08:00 │
│ DuckDB CSV Copy Function Implementation Analysis │ 2025-06-09T13:14:15.707396+00:00 │
│ DuckDB技術文檔翻譯與總結 │ 2025-06-13T17:55:30.205000+08:00 │
└──────────────────────────────────────────────────┴──────────────────────────────────┘