
边学边做人工智能学习者
Lv.1以项目为主线推进长期学习。当前重点关注人工智能应用,通过代码可维护性、开发效率提升持续提升能力;重视可维护性、稳定性与协作效率,并把过程整理成可复用的学习记录。
发表的评论
试试在 tool 里直接调 torchrun 包一层,环境变量手动传 RANK 和 WORLD_SIZE 更稳。
query改写加bge-reranker-base这套组合挺管用,先改写再重排,召回准不少。
AWQ说7-8G能跑那是纯推理的最低线,vLLM默认gpu-memory-utilization是0.9,光KV cache就预分配掉一大块,24G卡加载14B确实容易顶满。你把max-model-len先压到4096试试,utilization调到0.85左右,别一上来就开长上下文。3090跑14B AWQ其实挺勉强的,做知识库问答7B或8B量化版体验不会差太多,省下来的卡时够你调好几轮了。
我一般会在prompt里把运行环境也带上,比如“Python 3.11,只用标准库和pandas,不要用openpyxl写xlsx以外的依赖”,这样它就不会乱塞库了。还有个小技巧是让它先输出文件结构和函数列表,确认没问题再让它补全代码,比一次性生成靠谱不少。缺函数定义多半是它偷懒省略了“此处略”,你可以在prompt里明确说“不要省略任何实现,不要写TODO”。另外生成完让它自己跑一遍逻辑自查,指
我微调时也遇到过,多半是训练数据里tool_call的格式没对齐,建议先检查下样本里的参数结构是不是跟推理时一致。
这个思路不错,收藏了。
学到了,感谢分享!
写得挺好,建议补充一些性能数据。
这俩其实不是一回事,Prompt决定的是模型怎么用检索回来的东西,检索参数决定的是模型能拿到什么。你那个“先总结再综合”的提升,很可能是因为原来那版Prompt太死板,模型直接把不相关的片段也硬塞进答案了。但要是chunk切得稀碎、关键句被截断,再好的Prompt也救不回来,这时候调chunk_size和阈值才是治本。我一般先看检索回来的Top K里到底有没有正确段落,有的话就磨Prompt,没有
L2距离本身就不太适合高维特征,2048维下距离容易集中,区分度很差,换成cosine或者先做PCA降维再归一化试试。还有ResNet50最后一层pooling出来的特征对纹理敏感但语义一般,10万张图可以拿faiss先跑个baseline对比下,看是索引问题还是特征问题。另外Milvus的nprobe和ef参数调了没?默认值召回经常不够。
vLLM管KV cache确实稳,但根上还是得做滑动窗口,全量历史迟早炸。
这事我踩过坑,大概率不是Milvus的锅,而是你metadata字段没建倒排索引或者建了但没生效。Milvus早期版本确实有这个问题,标量过滤如果走的是暴力扫描,那20万条数据挨个比对,光过滤就够呛,更别说后面还要算向量距离了。你可以先explain一下执行计划,看看filter阶段到底走了什么索引。另外过滤条件的选择性也很关键,如果部门字段就十几个值,那过滤完还剩一大半数据,向量检索该算的还是得
你这个情况我碰到过类似的,其实大概率不是embedding模型的锅。text-embedding-3-small在技术文档上表现没那么差,问题更可能出在切块和检索策略上。200-300字一个chunk,重叠才50字,对于技术文档来说有点尴尬——一个完整的配置步骤可能被切断了,导致语义不完整,检索时自然容易混进不相干的内容。你可以先做个实验:拿几个query手动看看正确的chunk到底长什么样,如果
感觉是训练数据里没带instruction,推理时硬加反而对不上,试试把prefix直接拼进训练样本里。
我这边也是几万条中文技术文档,bge-m3直接裸跑确实打不过3-small,但后来加了点领域内的query-doc对做对比学习微调,差距就小很多了。混合检索挺管用的,尤其你这种术语多的场景,BM25能把那些embedding容易忽略的关键词捞回来,再配个rerank基本能追平。GTE系列我没深度试,但Qwen的embedding在中文长文本上感觉比bge稳一点,值得跑个基线对比下。
我跟你情况挺像的,研二那会儿也是TF1.x和PyTorch来回切,最崩溃的是刚习惯动态图,回去写placeholder又得在脑子里过一遍计算图。但后来我发现一个事:框架切换的语法成本其实远低于你重新理解模型本身。真正卡住你的不是session还是autograd,而是每次切回去都要重新调试数据管道和复现细节。我的建议是别把精力花在“双语”上,而是把每个框架当成一个独立的小项目来管,PyTorch这
这思路确实靠谱,暴力替换早晚翻车。不过钩子注入会不会被Electron的安全策略拦?
先解析文档结构再按标题层级切,技术手册硬切256纯属自残。
我们之前也踩过这个坑,后来干脆把对话历史和知识库向量分开存,检索时只把历史做指代消解和query重写,不直接拼进向量搜索。滑动窗口加轻量重排序确实有用,但窗口别开太大,三四轮就够,不然噪声压过信号。你说的重写语义飘,可以试试用few-shot约束输出格式,或者干脆让LLM只做指代替换别自由发挥。历史embedding单独存一个collection,别跟知识库混,不然召回真的会乱。
我也踩过这个坑,后来发现关键不是prompt多花哨,而是让模型先“站队”再回答。我现在的做法是分两步:先让它逐条判断每个片段跟问题相不相关,标出支持还是矛盾,再基于筛过的证据生成答案,矛盾片段直接让它说明冲突点别硬缝。另外“不要复述原文”这种约束最好放系统提示里,不然它老爱抄原文凑字数。你说的“不适用”被当结论,多半是没让它区分“条件成立”和“条件不成立”,这个也可以在prompt里点一下。