资讯动态

打造AI数字人:从微信聊天记录到个性化大模型微调全流程指南(数字生命案例)

发布时间:2026/9/11 19:47:56 来源:尧图企业网站定制
打造AI数字人从微信聊天记录到个性化大模型微调全流程指南数字生命案例【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm本指南以 self-llm 仓库中 examples/数字生命/readme.md 案例为核心完整讲解以本人为原型、用真实聊天数据微调出 AI 数字人的可迁移流程。整个流程分为三大环节聊天记录数据集的制作与精修、基于讯飞星辰 MaaS 平台的 LoRA 微调、通过 WebSocket 调用微调模型 API 并搭建聊天前端。读完本文你将掌握从原始聊天记录到可交互 AI 数字人的端到端实战方案并理解其中数据集清洗、超参数选择与人格化建模的关键细节。项目背景为什么需要灵魂分身现代生活节奏加快许多人因工作繁忙或地理距离难以时常陪伴家人与朋友情感上的疏离感日益加剧。AI 情感陪伴类产品因此应运而生但现有服务普遍存在三大痛点定制化成本高昂针对特定个体定制人格的服务难以普及信息安全难保障用户隐私数据存在泄露风险人格化缺失通用模型的回复容易出戏缺乏亲近感。对此本项目给出的思路是在角色扮演场景下进行模型微调。微调是在预训练模型基础上的再学习——模型本身已经具备较强的文本理解、逻辑与泛化能力只需要注入特定人物的个性风格数据就能较好地扮演目标角色。整个流程可迁移、可复制而其中最大的亮点正是数据集的制作。该项目曾获 2024 大模型微调挑战赛冬季赛最佳创意奖 Top3仓库介绍见 examples/readme.md。第一步数据集的制作——从微信聊天记录到 ShareGPT 格式数据集是 AI 数字人的灵魂素材。本项目的思路是把真实的微信聊天记录导出为 JSON再清洗、精修并转换为适用于多轮对话训练的 ShareGPT 格式。1.1 获取原始数据微信聊天记录导出首先在电脑端登录微信并同步聊天信息然后借助留痕MemoTrace工具导出与某位朋友的聊天记录将聊天内容导出为 JSON 格式保存至本地。导出的原始数据包含conversations、role、content三个核心字段。1.2 转换为 ShareGPT 格式为了让模型更好地学习对话模式需要将原始 JSON 转换为 ShareGPT 格式。参考的转换思路如下# -*- coding: utf-8 -*- import json from copy import deepcopy # 标准化角色命名 def convert_to_sharegpt_format(original_data, new_system_valueNone): sharegpt_data [] for conversation in original_data: new_conversation { conversations: [], system: new_system_value, tools: [] # 如果没有工具调用可以留空或设置为空列表 } system_message None for msg in conversation[conversations]: # if msg[role] system: # system_message msg[content] if msg[role] user: new_conversation[conversations].append({ from: human, value: clean_content(msg[content]) }) elif msg[role] assistant: new_conversation[conversations].append({ from: gpt, value: clean_content(msg[content]) }) # 如果原始数据中已存在 role: system 的消息其内容会优先用于设置新对话的 system 字段 # 即使传入了 new_system_value 参数也会被覆盖。 # # 将系统消息设置为system字段 # if system_message: # new_conversation[system] system_message sharegpt_data.append(new_conversation) return sharegpt_data # 读取原始JSON数据 with open(z.json, r, encodingutf-8) as f: original_data json.load(f) # 添加优化系统提示词可以理解为人设前提 new_system_value 你是替换为主角名字人设对你来说他人的需求感受在自己之前。此外你很喜欢倾听...... sharegpt_formatted_data convert_to_sharegpt_format(original_data, new_system_value) # 写入新的JSON文件 with open(sharegpt_formatted_data.json, w, encodingutf-8) as f: json.dump(sharegpt_formatted_data, f, ensure_asciiFalse, indent2) print(数据转换完成并保存为 sharegpt_formatted_data.json)选择 ShareGPT 格式的原因有三点天然适配多轮对话训练比单轮问答格式更适合角色扮演场景规范了角色命名human/gpt便于模型理解对话双方身份一定程度上避免混淆与幻觉便于人设完善补充通过system字段注入系统提示词作为人设前提。实际操作中有几个必须注意的坑记得修改system的值替换为主角名字与人设描述记得修改文件保存路径务必对数据集做敏感信息脱敏包括电话、密码、地址等这一点至关重要。1.3 数据集的人格化精修技巧本项目的数据集有两个特别的优化点值得保留参考保留颜文字与表情包文字例如[委屈]这类由表情包转成的文字被原样保留。实验证明这有助于大模型理解话语的情感色彩特征并模仿个性化的表达方式——微调后的模型能根据语境适时配上颜文字和表情包返回给用户改写 MBTI 思维数据集将自己对应 MBTI 人格的思维数据集按照聊天信息的形式改写把一些有代表性的问题场景改编成对话加入数据集便于模型捕捉角色思维模式的特征。此外还需要对对话片段不完整的数据进行筛选处理包括补充对话、删除话题跳跃的片段等。本项目约 3000 条数据中很多话题跳跃严重需要人为再清洗对于会给模型带来较大理解难度的跳跃片段直接去除对于某些存在跳跃但有价值的对话则添加适当的背景信息帮助模型建立正确的语境。更进一步可以尝试接入对话情绪色彩判断的 API为数据添加情感标签或为角色描述添加性格特点、职业背景、兴趣爱好等特征标签都有利于 AI 数字人的人性化、个性化示例如下{ from: gpt, value: 学会了吗[笑], character_traits: { personality: 聪明、热情、善良, occupation: 程序员, interests: [编程, 阅读, 旅行] } }为什么选择聊天记录做数据集日常交流中的大量细节——语气、口头禅、情感表达习惯——会逐渐在脑海中描摹出一个人的模样。让模型学一个人、模仿一个人本质上就是在这些细节里磨炼聊天记录无疑是造就灵魂分身最好的模板。1.4 与本仓库其他数据集的对照本仓库 dataset/ 目录下提供了同类案例的成品数据集可以作为格式参考dataset/huanhuan.jsonChat-嬛嬛项目的数据集18647 行采用instruction/input/output三段式结构例如instruction: 娘娘。对应output: 你放心本宫到任何时候都不会自轻自贱委屈了这孩子。dataset/huanhuan-100.json前 100 条子集便于快速调试dataset/huanhuan.jsonl同一数据集的 JSONL 行式版本。可以看到同样是打造个性化 AI不同的任务目标会选择不同的数据组织方式数字生命案例用 ShareGPT 格式承载多轮聊天记录而 examples/Chat-嬛嬛/train.py 这类剧本台词驱动的案例则使用instruction/input/output问答对。理解这些差异有助于你根据自己手头的数据形态选择合适的格式。第二步模型微调训练——基于讯飞星辰 MaaS 平台数据集准备好之后接下来进入模型微调环节。本项目使用讯飞星辰 MaaS 平台完成训练核心思路是选择开源通用大模型把自制的数据集交给平台进行训练学习微调。有一点需要特别留意按前述步骤得到的数据集属于ShareGPT 格式在平台上选择数据格式时不要选错。2.1 超参数设置建议学习率Learning Rate和训练次数Epochs是对最终模型性能影响最大的两个关键超参数选择时需要结合具体任务、数据集特征以及计算资源综合考量学习率Learning Rate可以理解为模型依据学习内容改变自身认知的幅度大小。过大的学习率可能导致模型无法收敛过小则训练缓慢甚至陷入局部最优。微调阶段建议从较小的值开始这样能较大程度保证损失函数曲线平缓、不剧烈震荡避免破坏预训练模型已学到的有用信息训练次数Epochs指整个训练集被遍历的次数。微调通常不需要太多训练周期因为预训练模型已具备一定的知识基础。如果数据集本身不大少于 500 条过多的训练周期会导致过拟合——模型在训练集上表现很好但在未见过的数据上表现不佳。这两个参数可以结合训练的 Loss 曲线不断调整曲线不要过于震荡也不能太平太平可能过拟合温度系数Temperature实验结果显示0.9 为佳大家也可以根据回应的效果多调试。2.2 微调方式选择LoRA 还是全量精调本项目最终选择LoRA 微调而非全量精调原因是综合考虑了时间与资源成本当数据集规模较小时实际上没必要对所有参数进行全面调整——大部分预训练模型已经具备良好的初始化和特征提取能力全量精调不仅增加不必要的计算负担还可能导致训练过程冗长且低效当然如果数据集很大如几万条则另当别论。这一选择与本仓库的整体技术路线一致self-llm 项目在 models/ 各模型目录下均提供 LoRA 微调教程与代码例如 examples/Chat-嬛嬛/train.py 中通过LoraConfig配置r8、lora_alpha32、lora_dropout0.1并对q_proj/k_proj/v_proj/o_proj/gate_proj/up_proj/down_proj等线性层注入 LoRA 适配器同时配合learning_rate1e-4、num_train_epochs3等训练参数正是小数据 低秩适配的典型实践。2.3 微调效果微调完成并发布后较好的效果表现为数字人在回复中自然使用颜文字和表情包让对方感觉温馨同时在意标点符号的情感表达——例如对感叹号、波浪号等符号的使用非常情有独钟。整体来说微调后的模型能够模仿出原型的个性化表达方式效果比较理想。第三步前端页面展示——通过 WebSocket 调用微调模型 API训练好模型并发布 API 后就可以搭建聊天前端了。本项目做了一个美观的聊天界面核心是通过WebSocket 连接到训练好的模型 API。以下为 API 调用的关键代码async function handleSendMessage() { const message userInput.value.trim(); if (!message) return; addMessage(用户, message, user-message); userInput.value ; // 这里是在讯飞平台里微调好并发布的模型的地址改成你自己的 const ws new WebSocket(wss://maas-api.cn-huabei-XX); // 以下几行为API调用在服务管控页的右下角信息调用处 ws.onopen () { const requestData { // 这要改成你自己的相关API header: { app_id: XXXXXXXX, uid: XXXXX, patch_id: [XXXXXXXXXXXXXXXXXXX] }, parameter: { chat: { // 这里我们选用的是星火13b的模型进行微调如果不是用的这个记得看讯飞平台的API调用文档说明对应地改 domain: xspark13b6k, // 这是温度系数 temperature: 0.9 } }, payload: { message: { text: [ { role: user, content: message } ] } } }; console.log(message); ws.send(JSON.stringify(requestData)); }; let fullResponse ; // 用于存储完整的AI响应 ws.onmessage (event) { const response JSON.parse(event.data); if (response.header.code 0) { // 拼接每次接收到的内容 const aiResponsePart response.payload.choices.text.map(choice choice.content).join(); fullResponse aiResponsePart; // 检查是否是最后一次响应 if (response.payload.choices.status 2) { addMessage(AI, fullResponse, ai-message); } } else { console.error(Error:, response.header.message); addMessage(AI, 抱歉服务器出现错误请稍后再试。, ai-message); } }; ws.onerror (error) { console.error(WebSocket Error:, error); addMessage(AI, 抱歉连接出现错误请稍后再试。, ai-message); }; ws.onclose () { console.log(WebSocket connection closed); }; }这段代码定义了一个名为handleSendMessage的异步函数在用户点击发送按钮时被调用获取用户输入的消息通过 WebSocket 连接到指定的 API 端点连接成功后发送包含用户消息的 JSON 请求数据header中包含app_id、uid、patch_idparameter.chat中指定domain与温度系数payload.message.text中携带对话内容监听onmessage事件接收并处理 API 返回的流式响应将各片段拼接起来当response.payload.choices.status 2最后一次响应时将完整回复显示在聊天界面中发生错误或连接关闭时在界面中显示相应提示信息。需要注意wss://maas-api.cn-huabei-XX地址以及app_id、uid、patch_id均需替换为你在讯飞平台微调发布后服务管控页面的实际信息。成功后即可在聊天界面与数字人进行沉浸式对话。仓库中该案例的界面效果截图可参考 examples/数字生命/image/readme/1738593252102.png图中展示了数字人回复用户问候的聊天窗口场景拓展与展望本项目的终极目标是降低成本让更多人享受到这种形式的暖心陪伴并探索如何在这个过程中不让人出戏——例如在你向它倾诉时如果因为敏感词规避设置它回一句对不起我只是一个语言大模型那会瞬间让人心凉。这个思路可以迁移到更多情感陪伴场景喜欢的、世界上可能不存在的动漫角色早已离你而去的亲人任何需要个性化陪伴的应用场景。整套流程的核心资产是数据集的制作方法真实聊天记录 ShareGPT 格式 人设系统提示词 情感化表达保留 MBTI 思维数据注入 人工清洗精修。这套方法论在 examples/ 目录下的多个案例如 examples/Chat-嬛嬛/readme.md 基于剧本台词打造个性化 AI 的流程中一脉相承读者可以对照学习。后续该项目还计划探索语音功能的加成让灵魂分身进一步完整。【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价