
一线低代码研究所
Lv.1主要整理低代码应用相关的学习笔记与工程经验,内容覆盖代码实现与工程实践、开源工具使用。相信长期积累胜过短期追热点,希望把复杂问题讲清楚、把实践步骤写完整。
发表的评论
1.8的loss对于LoRA来说其实不算特别离谱,但回答重复大概率是数据多样性不够,一万条看着多,如果相似问法太多模型很容易偷懒。你可以先抽几十条看看是不是有大量模板化的“问题-法条”结构,这种数据会把模型带偏。另外建议先别急着上全量微调,试试把LoRA rank调高到64或者128,有时候瓶颈在低秩矩阵的表达能力上。学习率这块我试过用warmup+余弦衰减,比固定lr稳定不少,你可以跑个50轮看
bge-reranker和cross-encoder其实是一回事,bge-reranker就是基于cross-encoder训练的,直接上它就行,别纠结。粗排精排建议保留,faiss召回20条后先让reranker跑一遍,取前5-8条给LLM,这样比直接砍top-k稳得多。另外你可以试试对召回的片段按窗口滑动切分,比如每256个token一段,重叠64个,然后再rerank,能避免关键信息被长段落
我这边之前也踩过类似的坑,后来发现问题往往不在embedding本身,而是索引里的数据粒度太粗。你试试把段落按小标题或语义块再切细一点,同时给每个chunk加上业务标签,召回后先用标签做一轮硬过滤,把明显不相关的历史版本直接踢掉,再进rerank,效果会干净不少。另外bge-m3对长尾实体确实弱一些,但换模型前先看看你es里的分词器是不是该上ik分词,有时候是分词把“报销流程”和“报销制度”搅在一
Pydantic确实比TypedDict稳,尤其嵌套结构多的时候,校验和序列化能省不少心。我一般只存必要字段加个原始数据的引用,全塞进去状态膨胀后排查问题能让人崩溃。回滚这块建议搞个快照机制,节点执行前把关键状态存一下,失败直接恢复,别指望LangGraph内置帮你处理。另外并发冲突可以试试用不可变数据结构或者给每个节点分配独立的写入槽位,别都怼一个dict上改。
试下把选中代码复制到新文件里让它改,改完再粘回来,基本能防跑偏。
24G跑7B FP16其实刚好卡在甜点上,你可以试试vLLM或者SGLang,它们自带PagedAttention能省不少KV Cache,长文本压力会小很多。量化掉点的话,可以考虑HQQ或者QuIP#这类较新的方法,4bit下比GPTQ稳不少。另外别忽略CPU offload,把部分层丢到内存里,只留关键层在显存,速度损失其实能接受。我之前用类似方案跑32K上下文,质量几乎没降。
我之前也遇到过类似情况,Ollama对长上下文的处理确实不如llama.cpp稳,尤其塞项目文件时上下文窗口一长,注意力分散特别明显。个人建议试试把8000行拆成按需加载的代码块,或者用RAG只把当前函数相关的定义丢进去,补全速度能回来不少。另外prompt里明确说“只参考以下代码片段”会比让它自由联想好很多,我这边实测重复字段名少了一半。
试试把客服角色和回复规则直接写进训练数据的system字段里,few-shot也得带上,光靠推理时加prompt没用。
vLLM那套确实跟LangChain的agent兼容性有点折磨人,我之前也被tool calling的格式坑过,后来直接换成了SGLang,配合OpenAI兼容接口反而稳很多。显存不够的话,embedding模型可以试试用CPU跑,或者干脆换个更小的bge-small,反正检索质量差距也没那么大。另外建议把向量库的mmap模式开起来,能省不少显存占用,但要注意磁盘IO别成瓶颈。
我之前也踩过这个坑,LLM做路由天生就是概率性的,你加再多“严格”指令它也可能犯迷糊。后来我直接把路由逻辑拆出来,用规则匹配关键字段做硬约束,只有拿不准才让LLM判断,稳定性一下就上来了。另外任务去重可以给每个节点加个全局的task_id,执行前查一下状态,能避免重复。卡死的话大概率是循环依赖或者某个节点没定义终止条件,建议给每条边都画个超时和fallback路径。状态机没必要全自己写,LangG
这俩框架在AWQ下表现差异挺大的,vLLM那个首token抖动我猜是显存碎片化导致的,试试把gpu_memory_utilization调低点留出余量,或者开下prefix caching看能不能缓解。SGLang的OOM确实常见,它默认的radix cache策略吃显存比较猛,可以手动限制下prefill的chunk size或者把decode的memory pool调小点,虽然会牺牲点吞吐但至
光靠prompt确实治标不治本,我是加了个答案与检索内容的相似度阈值,不达标就直接返回“未找到”。 你这情况多半是模型在硬圆场,不如把“不知道”改成“根据现有资料无法确认”,后置校验比prompt稳得多。
200万条真没必要上Milvus,ES把HNSW的M调到32基本够用,GPU纯属浪费。 同义改写召回差大概率是embedding本身问题,先试下把query做下改写再检索,比换库省事多了。
我最近也在搞LangGraph的多工具调用,遇到一模一样的问题,尤其是openweathermap那个appid,我怀疑它训练数据里就没见过真实请求长啥样。后来我试了个笨办法,把API的OpenAPI spec直接转成JSON塞进system prompt里,再让它必须从里面提取参数名,而不是靠记忆,幻觉确实少了很多。但代码一长它还是会偷懒,尤其涉及多个工具来回传参的时候,经常自己发明中间变量。你
我之前也踩过这个坑,256块感觉切得太碎了,尤其API密钥这种强上下文关联的内容,很容易把前后逻辑切断。建议先试试按语义段落切,别死守固定长度,再就是embeddings模型本身对短文本的区分度有限,加个reranker确实能救回来不少。轻量方案的话,可以看看bge-reranker-base,几MB的模型,跑在本地CPU上延迟也能接受,MCP里包一层HTTP服务就行。不过你这个问题也可能出在qu
说实话我也遇到过这种问题,Cursor有时候就是会自作主张加一堆东西,感觉它把“简单”理解成了“健壮”。后来我学乖了,prompt里直接写死“只改这一列,别动其他任何代码”,甚至把输入输出的样例都给出来,它反而老实很多。 另外你试试把需求拆成更小的步骤,一次只让它处理一个动作,别让它一口气干完所有事。模型这玩意儿就是容易脑补,你给的上下文越少,它越爱自由发挥。
试试把关键边界条件直接写进prompt里当硬性要求,比让它自己琢磨靠谱得多。
说实话我之前也踩过这个坑,后来干脆绕开了JSON,在MCP外面套了个gRPC或者直接用Redis当传输层,张量走byte流,元数据走MCP,这样两边都不耽误。不过这样协议就不纯粹了,不知道你们有没有试过把张量编码成base64再塞进JSON的,虽然还是重但至少比裸浮点数组可读性好点。另外PyTorch自带那个torch.save序列化其实效率也不高,我最近在试ONNX导出,感觉对MCP这种场景反而
说实话3000行确实到AI重构的临界点了,Cursor对全局上下文的理解会开始漂移。我的做法是每个模块单独开新对话,并且给它限定只改某个文件,禁止跨文件操作。另外commit确实要勤快,我基本每次让它改完代码就git diff看一眼,不对劲直接checkout,比写注释管用。至于Copilot,单行补全在复杂项目里反而更可控,至少不会自作主张给你拆文件。
说实话A10 24G跑7B FP16确实紧巴,我建议直接上两张卡张量并行,vLLM对TP的支持很成熟,速度比量化+offload稳多了。量化的话AWQ4bit质量损失其实可控,但你感觉变慢大概率是没开 Marlin kernel,换一下后端能快不少。工具链我个人更推荐GPTQ,生态跟vLLM配合好,llama.cpp适合本地折腾,生产环境别碰offload,延迟波动太大。对了,你max-model