
雨夜拾码记
Lv.1Open-sourceenthusiast,关注工具与工程实践,技术方向以软件工程为主。持续整理架构设计、开源工具使用和可复用的工程方法;相信长期积累胜过短期追热点。
发表的评论
试试把工具返回结果包在特定标记里,再让模型先复述再行动,能少掉不少幻觉。
核心还是得把每个工具的输入输出schema锁死,再配上重试和降级,不然模型一抽风就全崩了。
四五百条确实少了点,而且学习率调太高容易学歪,试试降到2e-5跑3轮看看。
这问题我太熟了,之前做个法律文档问答也是这个尿性。我觉得问题不一定全在检索质量,GPT-4的注意力机制本身就有个毛病,你塞给它十个片段,它默认把前面几个当成“重点”,后面那些哪怕更关键也容易被当背景噪音处理掉。我自己试下来,与其硬改prompt让模型“必须看全部”,不如反过来做一次粗筛之后的精排,比如用LLM自己对top-10片段做个相关性打分,或者直接让模型在两轮里分步处理,第一轮让它先总结每个
这个坑我太熟了,之前做客服Agent的时候也是全文塞进去,结果检索出来的全是“嗯嗯”“好的”这种废话。后来我改成存“对话摘要+关键实体+用户情绪值”三件套,摘要用LLM生成但限定在200字以内,实体用规则抽取人名、产品名、时间点,情绪值就一个-1到1的浮点数。这样检索的时候先按实体过滤,再在摘要上做相似度,效果比纯向量好很多,而且存储量直接砍了80%。不过摘要生成那一步确实会丢细节,我现在的折中方
八成是MCP server绑定了127.0.0.1而ollama在别的网络栈,试试把host改成0.0.0.0再配下CORS。 你client连的端口跟server监听的不一定是同一个,看看是不是8080被占了,或者直接用ollama自带工具链省心点。
遇到过类似的,但不是分割模型,是检测头回归坐标的时候精度崩了。后来查出来是某些上采样或者插值算子在ONNX里的实现跟PyTorch不完全一致,尤其是align_corners这个参数,默认值两边就不一样,你检查下这个。另外keep_initializers_as_inputs那个参数建议设成False试试,有时候会把权重变成输入导致精度异常,虽然看着不相关但真有人踩过坑。边缘糊的话,也可能是转的时
说实话我觉得你这个问题不是单纯调chunk size能解决的,512和256的差异本质上是召回粒度的问题,但真正影响语义断裂的是切分方式。我之前也踩过这个坑,后来试了按章节标题和段落边界做结构化切分,配合一个小的重叠窗口,效果比单纯调数字好很多。bge-m3本身对长文本的语义捕捉能力不弱,但中文的句子边界和自然段落往往承载了逻辑关系,硬切真的会拆散“甲方乙方”这种关联。至于重排序,bge-rera
我之前也踩过这个坑,所有状态塞一个大State确实后面改起来想死。后来我干脆把每个节点的输出定义成明确的字段,再用总State只保留真正需要跨节点共享的东西,临时结果直接不往总State里写,靠节点内部持有或者用个局部变量传。 子图隔离我觉得挺值得试试的,尤其客服和质检这种逻辑相对独立的,子图内部随便折腾,对外只暴露必要的输入输出接口,主图清晰很多。Redis那种外部存储对你们这个体量感觉没必要
百万级其实es够用,但带复杂过滤时向量库优势明显,我这边就是被标量过滤+召回率逼着迁的。
遇到transport closed大概率不是姿势问题,我前几天也踩过这个坑。你试试把stdio传输改成SSE模式,就是启动命令里加个--transport sse参数,再在Cursor里填对应的http地址,稳定性会好很多。另外检查一下你的异步工具函数是不是用了async def但没有正确await,MCP对事件循环很敏感,我之前就是漏了个await导致连接被掐断。端口防火墙那些反而影响不大,先
我之前也踩过这个坑,7B模型开gradient checkpointing不是简单设个True就完事了,关键得配合显存碎片优化,比如把activation checkpointing的粒度调细一点,按层数逐段开启效果会差很多。另外你batch size才2的话,建议先检查下是不是dataloader的pin_memory或者混合精度没开,fp16能省将近一半显存,速度还更快。我试过把checkpo
我试过类似的情况,torch.compile对固定shape的CNN其实提升有限,尤其ResNet这种老结构,计算密度不低,编译开销反而盖过了收益。你慢20%大概率是图编译和算子融合的启动开销摊不平,建议先把mode设为reduce-overhead,或者只compile model的前向部分,别包整个train_step。另外报错dynamic shape大概率是某些op内部有隐式view或re
把需求写成注释钉在代码前面,再强调“别动结构只填空”,基本能管住它。 试试直接跟它说“按我给的伪代码逐行实现”,别给它留自由发挥的空间。
这精度掉得有点多,正常来说ResNet-50转ONNX即使算子有细微差异也不该掉4个点。建议先检查下预处理和后处理是不是一致,特别是mean/std和softmax有没有被优化掉,另外opset版本可以试试13或更高。 我之前也踩过AdaptiveAvgPool的坑,ONNX里会展开成动态shape的Gather,容易导致数值偏差,可以手动改成固定尺寸的AvgPool试试。至于移动端,如果精度要
20 tokens/s确实偏低,但先别急着怀疑量化,Qwen2.5的7B在A100上跑40-60是常态。你检查过输入输出长度吗?如果生成长度很长或者并发请求多,吞吐掉到20也正常,官方benchmark一般用的是短序列+高并发。另外docker跑vLLM基本没有性能损耗,除非你用了默认的shm-size限制,建议加`--shm-size=10g`试试。还有个小坑,微调过的模型如果tokenizer
说实话memory server存短期对话确实够用,但一旦你要跨会话回忆“上周三讨论过的那个API设计”,或者让助手基于几十份文档给建议,向量库就逃不掉了。我个人踩坑下来觉得,召回飘多半是chunk切得太随意加没做rerank,建议你试试先按语义段落切片,再用cohere或bge的rerank模型过滤一遍,效果立竿见影。工具Schema这块,别光把description写长,最好把输入参数的类型和
阈值这东西真的不是拍脑袋定的,我踩过类似的坑。你加了0.8以后召回变差,大概率不是阈值本身的问题,而是你切片的粒度跟embedding模型对“相关”的判定标准不匹配。比如一个长文档切成512字的块,可能只有中间一小段跟query相关,但整块的向量被平均稀释了,算出来的cosine值自然就低,0.8直接把它拦掉了。我后来改成先粗召回top50,再用阈值过滤,而不是一开始就卡死,效果稳很多。另外你用的
换embedding确实要重调chunk和检索策略,BGE对中文更敏感,试试把chunk压到150以下或者加个BM25混合召回。
说到点子上了,分块和Embedding确实是得搭配着看,但我觉得你这个问题更可能出在“语义粒度”上。bge-large-zh-v1.5对512字符这种长文本块其实不太友好,它更擅长编码语义完整的短句或段落,你硬切成固定长度,很容易把“改密码的步骤”和“密码规则说明”这两个本来独立的语义单元搅在一起,检索时向量自然就偏向那种笼统的相关性了。我建议你先把文档按标题层级拆成有逻辑的段落,再对每个段落内部