简介面向大模型应用开发者与AI技术研究者这份可运行源码资源聚焦大模型个性化技术系统讲解从RAG到智能体的个性化实现路径。内容先界定个性化目标即让模型生成内容与用户偏好对齐再梳理用户偏好的四种来源显式用户画像、历史交互挖掘、用户生成内容分析及个性化用户模拟。针对RAG系统资源重点阐述在预检索、查询、生成三个阶段融入个性化信息的做法包括查询改写、稠密检索、稀疏检索、后检索优化等针对智能体则说明如何结合用户上下文、记忆与外部工具实现长期交互并对现有技术的优缺点与未来空间给出客观总结。资源共3个文件以HTML展示页、inscode配置及gitignore辅助文件为主整体仅10KB轻量紧凑便于直接运行体验。目前已有63人学习下载适合希望系统掌握大模型个性化技术并快速上手的朋友可帮助读者获得全景式技术解析与可实践源码为后续研究或项目开发提供起点。 做技术项目最怕的不是模型效果差而是方向选错。当初我开始做基于大模型的个性化助手时把用户资料全塞进 Prompt效果还行可一换业务场景就发现不对——同一套 Prompt 在不同用户身上表现天差地别。后来认真把提示词个性化、外挂记忆、参数微调和偏好对齐这条路走完才真正分清它们各自解决什么问题、成本差多少、在什么场景下必须用。这篇大模型个性化实操笔记整理了每种方案的原理、可运行源码和部署细节希望能帮你少走弯路。1. 个性化技术选型先弄明白你改的是“输入”还是“权重”1.1 四个层面的个性化方案到底在改动什么大模型个性化听起来是个笼统概念工程上其实可以拆成四层每一层改动的东西完全不同。第一层是提示词个性化。改动的是运行时输入模型权重不动。系统提示词里动态注入用户画像、业务背景和沟通风格让同一个模型面对不同用户时给出不同答卷。优点是零训练成本改动即生效但模型本身没有记住任何东西。第二层是记忆与检索个性化。改动的是外部数据。把用户的历史对话、笔记、偏好记录等片段向量化后存进向量数据库每次提问先做相似度检索再把命中内容拼接进上下文。它解决的是“用户历史太长塞不进也塞不起”的问题。第三层是参数级个性化。通过 LoRA、QLoRA 这类参数高效微调技术去更新低秩权重矩阵让模型对某个领域或某个用户形成“骨子里的理解”回答不依赖上下文里有没有这段信息天然稳定。第四层是偏好对齐。基于 DPO 或 RLHF 这类技术用成对的偏好数据教会模型“这个用户喜欢直接给结论另一个用户喜欢先讲原理”。它解决的是“能力有了但交互风格不对”的最后一公里。前两层在推理阶段做文章后两层在训练阶段做文章。前两者迭代快、成本低后两者效果深、复用广。理解这个分层逻辑是为了后面做选型时不迷糊。1.2 不同场景对应的方案选择矩阵我按自己跑过的项目经验整理了一张表方便你按实际情况直接定位个性化程度推荐路线成本典型场景轻度适配提示词动态注入极低仅 prompt 逻辑客服机器人、官网问答、通用助手中度记忆RAG 记忆检索低需维护向量库企业知识库、个人助理、咨询业务深度定制LoRA/QLoRA 微调中需 GPU 训练垂直行业模型、专属写作助手风格对齐DPO/RLHF中高需构造偏好数据内容创作、陪伴交互、品牌风格定制我的经验是能用前两招搞定的先别碰后两招。微调最大的风险不是训练不起而是数据出问题之后整个模型“变傻”排查代价极高。先跑通提示词和 RAG验证用户反馈再考虑微调是相对稳妥的路线。2. 提示词个性化动态上下文注入的完整可运行实现2.1 工作原理与边界预判提示词个性化的本质是利用大模型的上下文学习能力。模型在海量真实对话中见过无数角色设定和背景信息当你把用户的职业、技术栈、目标、偏好写进上下文时它的输出概率分布就会被引导到这个用户的背景里。你不需要训练模型而是在“引导”它。但这招有一个明确边界模型上下文长度有限用户画像写太长反而会把注意力稀释掉所以要精炼成一眼能读完的字段。另一个边界是它无法真正“记住”用户——每次对话都需要外部系统把画像拼好传进来模型自身没有记忆。2.2 代码一个可直接套用的个性化消息构造器下面是一段实际能跑的 Python 代码它把用户画像渲染成 Chat 格式消息。依赖只有一个 openai SDK模型服务可以指向本地也可以指向远端pip install openai# personal_prompt.py import os from openai import OpenAI # 用户画像字段可按业务扩展但不要贪长 PROFILE { user_id: u_1001, name: 小林, role: 独立开发者, skills: [Python, FastAPI, PostgreSQL], tone: 直接给结论别铺垫, goal: 把数据分析工具做成 SaaS } def build_personal_messages(question: str, profile: dict): skills 、.join(profile[skills]) system_content ( f你是{profile[name]}的专属技术顾问。\n f对方身份{profile[role]}。\n f技术栈{skills}。\n f沟通风格{profile[tone]}。\n f当前目标{profile[goal]}。\n 回答时先考虑这个背景尽量给可落地的方案。 ) return [ {role: system, content: system_content}, {role: user, content: question} ] def ask(question: str): client OpenAI( api_keyos.getenv(LLM_API_KEY, EMPTY), base_urlos.getenv(LLM_BASE_URL, http://localhost:8000/v1) ) messages build_personal_messages(question, PROFILE) resp client.chat.completions.create( modelqwen2.5-7b-instruct, messagesmessages, temperature0.6, max_tokens1024 ) return resp.choices[0].message.content if __name__ __main__: print(ask(我想给工具加个用户认证用 JWT 还是 session))这里有个设计细节值得说用户画像被拆成了 role、skills、tone、goal 四个维度而不是简单堆一句“他是谁”。因为大模型对角色、技能、风格、目标这四类信息非常敏感分开描述比写一行流水账更容易被模型捕捉。tone 字段相当于一套“沟通协议”能明显抑制通用模型喜欢长篇大论的毛病。2.3 提示词流程的工程细节提示词个性化想稳定画像一定不能硬编码。真实项目里我会把 PROFILE 换成数据库或缓存查询在每次请求到达时拉一次用户信息再注入。接口链路大概是用户请求 → 网关鉴权 → 加载用户画像 → 渲染 messages → 调模型 → 返回响应。另外一个容易踩的坑是你把用户画像放进了 system 消息但有些模型对 system 指令的理解不如对多轮对话理解得好。遇到这种情况我建议把最关键的一句话做成“伪造的用户历史对话”比如构造一条“用户我的沟通风格是什么助手你喜欢直接给结论不铺垫。”放在 user 消息前面。这种少样本提示往往比干巴巴的 system 强不少。3. 记忆与检索个性化把用户历史变成可查询的知识库3.1 为什么不用“全量历史塞 prompt”当你要为同一个用户做持续性服务时核心难题立刻出现用户昨天讨论的技术方案、上周提的需求、上个月确认过的接口权限应该怎么喂给模型最粗暴的做法是把所有历史拼进 prompt但几轮对话后 token 就爆了费用失控。而且长上下文里塞满低质量历史模型反而更容易忽略关键信息。正确做法是引入检索用户提问时先从外部存储中找出与当前问题最相关的 3-5 段历史再拼进 prompt。这个思路在检索增强生成里就是 RAG它是个性化应用中记忆模块的工程标准。核心原则是“宁缺毋滥”与其把几百条历史全丢进去不如精确挑出最贴题的几条。3.2 代码用户记忆向量库的构建与检索下面给出一段基于 Chroma 和 BGE 中文向量模型的代码。它把每条用户历史记录转成向量存入以用户 ID 命名的 collection之后每次提问按相似度召回。pip install chromadb sentence-transformers# user_memory.py from sentence_transformers import SentenceTransformer import chromadb USER_ID u_1001 # BGE 中文嵌入模型本地可离线运行适合低成本场景 embed_model SentenceTransformer(BAAI/bge-small-zh-v1.5) client chromadb.PersistentClient(pathf./memory_db) collection client.get_or_create_collection( namefuser_memory_{USER_ID} ) def add_memory(memory_id: str, content: str, category: str general): 写入一条用户记忆比如聊天记录摘要、用户标注的偏好 emb embed_model.encode(content).tolist() collection.add( ids[memory_id], embeddings[emb], documents[content], metadatas[{category: category}] ) def retrieve_memory(query: str, top_k: int 3): 根据当前问题召回最相关的用户历史 q_emb embed_model.encode(query).tolist() hits collection.query( query_embeddings[q_emb], n_resultstop_k ) docs, scores hits[documents][0], hits[distances][0] results [] for doc, score in zip(docs, scores): # chroma 的 distance 是余弦距离越小越相似 results.append({content: doc, similarity: 1 - score}) return results if __name__ __main__: add_memory(m1, 小林决定用 FastAPI 重构后端, project) add_memory(m2, 小林偏好 PostgreSQL不喜欢 MySQL, preference) add_memory(m3, 产品计划下个月上线 SaaS 版本, goal) print(retrieve_memory(数据库选型, top_k2))这段代码跑通后你的应用就具备了最基本的“记忆库”。每次用户提问先调 retrieve_memory 取回 3 条记忆再拼入提示词模型就能说出“我记得你之前定过……”这种真正个性化的回答。3.3 召回质量比模型选择更关键我踩过最深的坑是向量模型选得差导致召回内容驴唇不对马嘴。经验就一条中文场景先试 BGE 系列别一上来就套英文嵌入模型数据量大时用 bge-m3能在效率和质量之间平衡。另外记忆的写入频率和数据清洗很重要。建议给每条记忆加上时间戳和来源写入时做去重和摘要。否则向量库里堆满过期信息召回再准也只能给用户看昨天已经失效的结论。4. 参数级个性化LoRA 微调和 DPO 对齐的工程化源码4.1 LoRA 的原理回顾低秩矩阵为什么好用当提示词和 RAG 都不够用时——比如你希望模型对某个行业的术语、业务规则形成稳定且不动摇的理解——就得考虑参数级微调。LoRA 的核心思想很巧妙大模型权重是满秩矩阵在适配新任务时其实只需要在一小部分低秩子空间里调整。训练时冻结原始权重只加入两个小矩阵 A、B 做近似更新推理时把 LoRA 权重叠加回主干模型效果接近全量微调但显存占用和训练时间少一个量级。4.2 代码用 LLaMA-Factory 跑 LoRA 训练这里建议直接用开源生态里最成熟的 LLaMA-Factory避免手写 Trainer 踩配置坑。安装很简单然后准备数据、注册数据集就能开训pip install llamafactory假设训练数据是data/personal_assistant.json格式如下[ { instruction: 请帮我设计用户认证方案, input: , output: 基于你当前的 FastAPI 技术栈我建议采用 JWT Refresh Token 方案在登录接口签发短期 access token再用长期 refresh token 刷新…… } ]把它放到 LLaMA-Factory 的 data 目录并在 dataset_info.json 里注册为personal_assistant然后执行llamafactory-cli train \ --model_name_or_path Qwen/Qwen2.5-7B-Instruct \ --stage sft \ --finetuning_type lora \ --dataset personal_assistant \ --template qwen \ --output_dir ./lora_personal p a hrefhttps://download.csdn.net/download/xxx12/92708004 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p