
深夜商业工具箱
Lv.1主要整理商业分析相关的学习笔记与工程经验,内容覆盖业务流程拆解、数字化方案落地。喜欢从问题、方案到复盘形成完整闭环,希望把复杂问题讲清楚、把实践步骤写完整。
发表的评论
把prompt拆成固定模板加变量占位符就行,改需求只动变量那块,省事多了。
68%也不算崩吧,我觉得得先搞清楚你预处理时chunk怎么切的。bge-large-zh对长文本其实挺敏感的,段落切太碎或者太长都会掉召回,你可以试试512token左右带点overlap。另外bge有个官方推荐的query instruction前缀,查询侧不加的话相似度会明显偏低,这个坑很多人踩过。top-20才68%确实有提升空间,但先别急着换库,把切分和查询侧指令对齐了再看数据。
小batch确实很难吃到编译红利,inductor那套kernel融合在计算密度低的时候overhead反而更明显。你序列固定到512了可以试试dynamic=False加mode='max-autotune',reduce-overhead主要走cudagraph省launch开销,但跟QLoRA的dequant容易冲突。Triton codegen失败大概率是SDPA跟低精度算子搅在一起了,试
我折腾过一阵,最后发现光调chunk size基本是在瞎猜。真正有用的是先搞个几十条的真实query做评测集,把recall和答案准确率都跑一遍,再反过来定切法。表格和代码块这块建议单独处理,别硬塞进统一递归切分里,按文档结构走比langchain默认那套靠谱。另外embedding模型的最大token数只是上限,实际取三分之一到一半效果往往更稳。
我最近也在踩这个坑,感觉RAG的prompt跟普通聊天真不是一回事。普通对话你只要管住语气和角色就行,RAG还得管住模型别乱用检索回来的东西,得明确告诉它哪些片段能用、哪些直接忽略。我试过在prompt里加一句“如果检索内容跟问题无关,就当没看到”,效果比单纯说“不要编造”好不少。另外让模型说“不知道”也得给个具体触发条件,比如“检索结果里没有直接提到答案时,只回一句暂无相关信息”,不然它还是会硬
模型八成没复用,每次请求都重新加载了吧?搞个常驻单例或模型池,别反复load。
单次Prompt确实很难把复杂脚本写到能直接跑,尤其是Excel处理这种边界情况一堆的场景。我一般会让它先写主体逻辑,跑通后再把报错贴回去让它针对性修,比一开始就要求“完整可运行”靠谱得多。另外变量冲突和异常处理这类问题,可以在Prompt里直接要求它按函数拆分并加try-except,效果会稳一些。
不用全包enable_grad,LLM推理本身没梯度,重点是把采样动作的log_prob留下来。
先按标题切再embedding,固定512太粗暴了。重排很有必要,粗召回加cross-encoder效果立竿见影。
我也踩过这个坑,后来发现问题的关键其实不在措辞本身,而是你给的“边界”太硬了。你写“只基于提供的文档回答”,模型听到的是“不许用我自己的知识”,但检索片段又经常缺胳膊少腿,它就只能在“瞎编”和“说不知道”之间反复横跳。我现在的做法是把指令拆成两层:一层是“优先使用<context>里的信息”,另一层是“如果context不足以回答,明确说出来,但可以补充常识性背景”。这样模型有个台阶下,不会硬编。
我一般是分两段写,前面固定一段“角色+约束”,后面根据任务临时拼一段“本次目标”。必须写死的只有三样:语言版本、允许/禁止的库、输出形态(是思路还是代码、要不要解释)。其他像项目背景、命名习惯这些,我宁可放在当轮user里,因为放system里模型会当成永久宪法,后面想松绑都难。你说的“过度服从”我太有同感了,Qwen2.5-Coder尤其明显,system里只要提了“完整实现”,它连你没问的测试
两个都在生产环境跑过,说点实在的。Milvus 功能确实全,但那个部署复杂度真的劝退,etcd、MinIO、Pulsar 一套下来运维成本不低,小团队慎入,我们后来换成单机版才消停。Qdrant 上手快很多,Rust 写的性能也稳,过滤查询这块比 Milvus 顺手,但分布式这块成熟度还是差一截,集群模式踩过几次 rebalance 的坑。Milvus 的坑主要在版本升级,2.2 升 2.3 那会
我一般会在项目根目录放个.cursorrules文件,把关键库的版本和用法示例写进去,比在prompt里临时说管用多了。Pydantic v2和httpx这种更新频繁的库,AI训练数据里新旧混杂,光靠注释它真不一定理你。我的做法是让它先读一遍requirements或者pyproject再动手,写完自己再扫一眼依赖相关的部分,别全信。
我之前也踩过这个坑,MCP本身确实没定义上下文隔离,它更像传输层协议,状态得自己管。我现在的做法是每个Agent请求带一个trace_id,在MCP server里用Redis按这个id存上下文,key加上工具名前缀,这样不同任务天然隔开。另外别把session塞进工具参数里传,容易被模型改写,建议走header或者初始化时的metadata。如果并发量不大,其实内存里搞个LRU缓存也够用,省得搭
4090跑7B LoRA其实挺够用的,batch size上不去多半是序列长度和optimizer state吃显存。试试bitsandbytes的4bit量化加载base model,再配合paged_adamw_8bit优化器,显存能省一大截,batch size开到8都没问题。loss不稳的话可以调低学习率到1e-4左右,warmup多给点步数。DeepSpeed ZeRO-2对单卡提升不大
MCP本身走的是JSON-RPC协议,传输层就是文本,所以tensor和numpy数组没法直接塞进去。但你可以把数组序列化嘛,比如转成base64或者用共享内存传引用,client拿到再反序列化就行,性能损耗看数据量。我之前试过在MCP server里做预处理再返回处理后的索引或路径,训练脚本自己去读,这样绕开了大数组传输的问题。不过说实话,MCP更适合做调度和编排层,真要把整个数据管道塞进去,可
6.7B做补全确实勉强,试试deepseek-coder-v2 16B的Q4量化,M2 Pro带得动,补全质量能上一个台阶。
我踩过一模一样的坑,后来发现光靠调阈值确实治标不治本。你可以在存记忆的时候把关键实体抽出来当元数据,比如“今天”“明天”单独打标签,检索时先做一轮时间过滤再算相似度。另外向量库一般没有语义去重,得自己在写入前做一轮近似查重,超阈值就合并或覆盖。embedding模型也有影响,但换模型不如把结构化信息补上管用。
这个问题我前段时间也踩过,Qwen2.5-7B做function calling确实有概率抽风,尤其是多轮对话里上下文一长就开始飘。我后来发现光靠system prompt强调“必须调用”作用有限,模型有时候就是会自作聪明直接用自然语言回答。我的做法是在prompt里把工具描述写得更死板一点,参数schema加上明确的类型和示例,另外把历史消息里那些没触发tool call的轮次清理掉,减少干扰。
500条确实偏少了点,尤其是指令跟随这种任务,模型容易过拟合到那几百条的表面模式上,泛化自然差。loss振荡在2.3左右不一定是数据量的问题,也可能是target modules只挂了q_proj和v_proj,表达力不够,试试把mlp层也加进去。还有重复问题这个现象,多半是训练时没做mask,把instruction部分也算进loss了,模型就学会了复读输入。建议先查一下数据模板和loss ma