Xuất lịch sử trò chuyện: năm nền tảng, năm cách hiểu không tương thích về cùng một thứ
Nền tảng nhắn tin nào cũng cho bạn xuất dữ liệu của mình ra, và nền tảng nào cũng tự quyết định độc lập xem một cuộc trò chuyện nên được biểu diễn thế nào trên đĩa. Nội dung bên dưới thì giống hệt nhau — ai nói gì, lúc nào — nhưng hình dạng thì chẳng có điểm chung nào. Có cái là một tệp nhật ký văn bản mà định dạng dấu thời gian phụ thuộc vào vùng cài trên máy bạn. Có cái là một cây các nút khóa theo mã định danh, trong đó cuộc trò chuyện là một đường đi duy nhất xuyên qua đồ thị. Có cái là một thư mục tệp sắp theo kênh và theo ngày, còn tên người thì cất ở một chỗ hoàn toàn khác.
Trang này đọc được tất cả và trả về một bản ghi dễ đọc. Nền tảng được suy ra từ chính cấu trúc tệp chứ không phải từ tên tệp, nên bạn cứ thả bản xuất vào mà không cần khai báo mình đang có gì. Mọi thứ chạy trong tab trình duyệt này.
Việc nhận dạng hoạt động thế nào
Tên tệp vô dụng cho việc này. Một nửa số nền tảng đặt tên bản xuất là conversations.json, mà tệp thì kiểu gì cũng bị đổi tên trên đường đi qua email và ổ đám mây. Nên việc nhận dạng đọc cấu trúc: một mảng chat_messages đi cùng một trường sender, một đối tượng mapping ghép với create_time, một trường ts chứa dấu thời gian Unix dưới dạng chuỗi. Mỗi thứ là một dấu vân tay mà chỉ một nền tảng sinh ra.
Có một chi tiết về thứ tự kiểm tra thực sự quan trọng. Bản xuất WhatsApp trên iPhone mở đầu bằng [12/03/2024, 14:23:01] — một dấu ngoặc vuông, mà đó cũng là cách một mảng JSON bắt đầu. Thử JSON trước thì mọi nhật ký chat từ iPhone sẽ bị đẩy cho bộ phân tích JSON và hỏng ngay tại đó. Vì vậy mẫu dòng WhatsApp được kiểm tra trước phép thử dấu ngoặc, không phải sau.
Năm hình dạng
- WhatsApp ghi ra một tệp nhật ký thuần văn bản, mỗi tin nhắn một dòng, với định dạng dấu thời gian thay đổi theo hệ điều hành và theo vùng. Tin nhắn nhiều dòng thì các dòng sau chạy tiếp mà không có dấu hiệu gì, nên bộ phân tích buộc phải coi mọi dòng không có dấu thời gian là phần tiếp của dòng trên.
- ChatGPT lưu mỗi cuộc trò chuyện thành một bản đồ các nút. Mọi câu trả lời được tạo lại và mọi câu hỏi đã sửa đều được giữ như một nhánh, nên muốn dựng lại đúng thứ bạn từng nhìn thấy thì phải đi từ gốc và bám theo nút con cuối cùng ở mỗi bước.
- Claude dùng một mảng phẳng, dễ nhất trong năm. Nếp gấp duy nhất là bản xuất mới đặt nội dung tin nhắn trong một danh sách khối có kiểu, còn bản cũ dùng một trường chuỗi thuần, nên cả hai đều được đọc.
- Slack là một cấu trúc thư mục: mỗi kênh một thư mục, mỗi ngày một tệp JSON, cộng thêm một tệp
users.jsonriêng giữ bảng danh tính. Tin nhắn gọi người bằng những mã nhưU0123ABCD, nên thiếu tệp đó thì mọi tin nhắn đều được gán cho một dãy ký tự. - Discord, theo dạng mà bộ công cụ cộng đồng phổ biến tạo ra, là một đối tượng duy nhất chứa metadata của kênh và một mảng tin nhắn phẳng. Đơn giản, và gần nhất với thứ bạn sẽ tự thiết kế nếu được làm lại từ đầu.
Cái gì bị gỡ đi
Một bản xuất thô chứa rất nhiều thứ không ai muốn đọc. Mặc định là bỏ chúng đi, và các công tắc mang chúng trở lại:
Thông báo hệ thống. Dòng thông báo mã hóa ở đầu mọi bản xuất WhatsApp, người vào người ra nhóm, đổi tên nhóm, “tin nhắn này đã bị thu hồi”, subtype channel_join của Slack. Trong một nhóm chat có người ra vào liên tục, số này có thể nhiều hơn cả tin nhắn thật.
Chỗ đánh dấu tệp đính kèm. <Media omitted> xuất hiện ở mọi chỗ từng có ảnh hoặc tin nhắn thoại, và trong một đoạn chat nhiều ảnh thì nó chiếm gần hết tệp. Nó cho bạn biết có chuyện gì đó đã xảy ra và không cho biết gì về chuyện đó.
Phần máy móc ẩn. Bản xuất ChatGPT có kèm system prompt và mọi lưu lượng công cụ, được đánh dấu là ẩn khỏi cuộc trò chuyện. Những thứ đó chưa từng hiện ra cho bạn và bị bỏ.
Tệp nén cũng xử lý được
Slack và ChatGPT giao tệp .zip chứ không phải JSON rời, nên bạn thả thẳng tệp nén vào cũng được. Bộ đọc tìm conversations.json trước, vì khi có tệp đó thì nó chính là toàn bộ bản xuất. Không thấy thì nó coi tệp nén là một workspace Slack: nạp users.json trước mọi thứ khác để danh tính được giải, rồi duyệt các tệp theo ngày và gom lại thành một bản ghi cho mỗi kênh theo đúng thứ tự thời gian. Tệp nào không nhận ra thì bỏ qua chứ không làm hỏng cả kho.
Vì sao việc này chạy trong trình duyệt của bạn
Đây là loại đầu vào mà chuyện đó quan trọng nhất trên cả trang. Một bản xuất chat không phải tài liệu bạn viết cho người khác đọc — nó là nhiều năm trò chuyện riêng tư, và nó chứa đúng những gì đã được nói ra. Địa chỉ. Sức khỏe. Tiền bạc. Chuyện về những người khác chưa từng đồng ý gì với việc này.
Tải thứ đó lên một dịch vụ chuyển đổi nghĩa là tin vào chính sách lưu trữ của một người lạ, vào cách họ kiểm soát truy cập, vào bản sao lưu của họ, và vào tương lai của họ. Việc phân tích ở đây là JavaScript chạy trong tab này. Tệp của bạn được trình duyệt đọc, chuyển đổi trong bộ nhớ, rồi hiện ra cho bạn. Không có bước tải lên, nên không có gì để lưu và cũng không có gì để xóa. Làm theo cách này còn có nghĩa là chạy nó không tốn đồng nào và dùng được ngoại tuyến sau khi trang đã tải xong.
Trang riêng cho từng nền tảng
Nếu bạn biết rõ mình có gì, các trang riêng có kèm hướng dẫn xuất dữ liệu cho từng nền tảng: WhatsApp, ChatGPT, Claude và Slack. Chúng chạy cùng một bộ phân tích, nên kết quả không khác gì.