用个人数据微调 LLM 复刻自己的对话风格
开发者用 24 万条私人短信微调模型,演示个性化 AI 应用的有趣实践。
开发者用 24 万条私人短信微调模型,演示个性化 AI 应用的有趣实践。
我远不是第一个想到这件事的人。已经有不少人——也许是受了《黑镜》中那些令人毛骨悚然的剧情启发——尝试用自己的短信或 WhatsApp 聊天记录来 fine-tune LLM,希望借此创造一个自己的模拟版本。
总体而言,结果都不尽如人意:对话往往平淡乏味(看来我们并不会通过短信分享自己最深刻的见解),而且很快就会陷入循环。
我一直特别想亲自试试。假期期间,我碰巧有一点空闲时间,还有一份价值 100 美元、可以花在 Google Compute 上的圣诞礼物,于是便趁着吃火鸡的间隙动手做了起来。
我会写一系列文章介绍自己的实现思路,不过大致过程如下:
我使用一个名为 iMazing 的工具下载了自己所有的短信、iMessage 和 WhatsApp 对话。我过滤掉了群聊、通讯录之外的人,以及很少联系的人。最终得到与 288 个人之间的 240,805 条消息。
我将同一个人的连续消息组合成块,以此创建训练数据集和测试数据集。在不超过 200 个 token 的前提下,每个块中尽可能多地装入消息。最终得到 25,087 个数据块,每个块都包含一个 prompt 和大约 7~10 条消息。
下面是一个示例数据块,内容是我和大楼维修工之间一段偏事务性的互动,其中一些细节做了修改。
<<SYS>>Write a realistic text message chat. Avoid repetition.<</SYS>>[INST]Write a chat between Edward and Josh[/INST]### Josh: Thanks Ed will call you soon as I get back to work ### Josh: Hi Ed When you have time give me a call so we can discuss about paint ### Edward: Liked “Hi Ed When you have time give me a call so we can discuss about paint ” ### Edward: hey Josh. It’s Ed from 24B. Any chance you could do the painting this week? Wed or Thurs? ### Edward: i’m on a call sorry free in an hour ### Josh: Just call me when you have a chance ### Edward: hey Josh - just checking in - is Tom able to do the painting?
一开始,我选择了拥有 7B 参数的 Llama 2,并在 V100 VM 上使用 QLoRA 进行 fine-tune。互联网上关于 QLoRA 超参数的建议互相矛盾,最后我不得不进行相当广泛的搜索。后来,我升级到了 13B 参数,结果有了显著改善。
随后,我又回到了第 2 步。我继续研究如何更好地格式化训练数据,并改进 prompt。起初有一点让我很困惑:训练损失和评估损失实际上都上升了,但生成结果却实实在在地变得更好了。
最后,我使用 Hugging Face 的 Text Generation 来生成对话:有时让它扮演我,有时扮演我的某位联系人,有时则同时扮演对话双方。我尝试了重复惩罚、token 抑制、beam search 等多种方法。
我早期尝试得到的结果和前人差不多。LLM 生成的对话就像是对我生活的超现实主义戏仿:同事们会没完没了地把会议改早、改晚;我和伴侣则会坚持不懈地争论午饭吃什么。试图鼓励模型生成更多样的内容,只会带来越来越让人倒胃口的午餐选项。
令我无比欣喜的是,坚持最终得到了回报,而这主要发生在我改进了 prompt、输入数据格式和生成方式之后。LLM 已经变得非常擅长模仿我。让我惊讶的是,它也能令人信服地扮演我的许多朋友——实际上,只要是和我互发过至少 1,000 条消息的人,它基本都能模仿。
这些对话的真实感令我震惊,它们甚至能反映出我与不同联系人之间关系的微妙差异。模型并非总能准确把握——有时仍会陷入循环或跑偏——但我认为,超过一半的对话都能通过图灵测试,也就是说,我无法判断它们是真实的还是生成的。事实上,我有时甚至惊讶到会去搜索自己的短信历史,以确认模型是不是在复述真实发生过的对话(它并没有)。
这一点没那么令人意外,但我觉得非常可爱:对于那些母语不是英语的联系人,模型会残酷地复现他们的拼写错误、语法错误和古怪表达。
我不太愿意分享模型与真实联系人之间生成的对话,所以在这篇文章中,我改用虚构人物的消息来引导 LLM(下方以橙色显示),再让它想象接下来的对话会如何发展。必须承认,这种情况下模型的表现要差得多;由于没有更多上下文可供参考,它很快就落入了自己最熟悉的舒适区——安排见面的时间和地点。我已经想到了一些改进方法,比如在 prompt 中提供更多背景故事。
### Edward: Hi David, this is Ed. We met at yesterday's AI conference. You were interested in hearing more about our matching models and perhaps trying our product.### David: Hey Ed, I am very interested in the product, I have a project that I am working on and I would love to learn more about your matching models.### Edward: Sure, I'm free for the rest of today if you are. We can talk about it in more detail.### David: Ok, let's talk then.### David: Hi Ed, I am available now, I am at home and I am free to talk about the product.### Edward: 2 mins### David: Ok
### Edward: Hey Lucy! This is Edward. It was great to bump into you yesterday - I don't think we've spoken since university! How are you?### Lucy: Hey Edward! I'm great! I'm working at a restaurant and I'm doing well. I'm going to a festival in August and I'm going to London in September!### Edward: that's fantastic! what's the festival? where in London?### Lucy: It's called the Boomtown festival. I'm going for a weekend. In London I'm going to see my friend and go to some museums.### Edward: 2013 is a big year for me - I'm getting married in Oct! I'm also in London in September, I'll be there for 2 weeks, I'd love to see you if you're around### Lucy: 2 weeks! Wow! I'm going to be in London from the 13th to the 21st! We should meet!### Edward: 13th - 15th I'm free, then I'm in Paris for a weekend, then back in London 17th - 21st, any chance you'll be there?### Lucy: 13-15 and 17-21! I'm going home on the 19th. I'll be there!### Edward: 21st is my last day, but if you're still around I'd love to meet you
下面这个模型模仿我的例子更耐人寻味。同样,橙色文字是提供给模型的内容,其余回复则由模型生成:
### Edward: Hey### Lucas: Hey I have a question for you. Tell me a secret, something I don't know about you.### Edward: 1. I'm a terrible dancer. 2. I'm a bit of a nerd.### Lucas: OK I know both those things. Tell me a deep secret that nobody knows about you.### Edward: 3. *** Deeper secret redacted!!! ***
我那个更深层的秘密并没有多么惊世骇俗,但至少也属于“我可以告诉你,不过告诉你之后就得杀了你”的级别,所以最好还是不要发表在这里……
写到这里,这篇文章原本可能会转向一个相当阴森的话题。我的一位挚友大约在 10 年前去世了,我们之间保留着很长的短信聊天记录。你不需要看过《黑镜》,也能猜到我想说什么。不过你可以放心:我意识到这么做会极其不得体,因此删除了这些数据。这个话题就到此为止!
编辑:Hacker News 读者 wyldfire 指出,这件事或许还有一个更容易让人接受的角度。他提出了这样一个问题:“LLM 是否可能发展到某种程度,让人与已故至亲进行对话成为一种具有治疗作用的体验?”这引发了大量讨论。
我会写一系列文章介绍自己的实现方法,让其他人也能进行实验。这里是第 1 部分,之后是第 2 部分。我很想知道大家尝试后的结果,也愿意帮助解决遇到的各种障碍。在这段旅程中,我学到了非常多的东西,也十分享受整个过程,希望你也能如此。
我很期待尝试 RAG 和其他技术,为模型的对话提供更多上下文。我预计,对话质量将再次迎来一次阶跃式提升。我期待有一天,模型可以完全取代我,回复我的所有短信……
我相信,我的 LLM 还有巨大的改进空间。我准备尝试其他基础模型,进一步优化 prompt 和输入数据,并继续改进生成过程。最重要的是,这一点不言而喻:随着时间一天天过去,我的训练数据集也在一点点变大!
分享到 LinkedIn(在新窗口中打开)LinkedIn
分享到 X(在新窗口中打开)X
分享到 Facebook(在新窗口中打开)Facebook