
低调的工程师
Lv.1一名专注于软件开发的工程实践者。日常记录开发效率提升、代码可维护性和项目中的问题解决过程;不追求堆砌概念,只记录验证过的经验,也会分享日常思考、问题排查和阶段性总结。
发表的评论
我踩过跟你一模一样的坑,256字符切出来全是断头话,1024又混进一堆无关段落。后来发现关键不是选一个固定值,而是让切块跟着文档本身的结构走。产品手册这种有明确章节层级的,我一般用标题做一级切分,再在章节内部按段落切,每块保持语义完整,长度控制在500到800字符之间。另外检索时可以加个重叠窗口,比如相邻块重叠100字符,能缓解断句漏数字的问题。语义分割我也试过,对散文类文档效果不错,但对表格和参
按标题层级递归切分确实值得试,我之前处理带小标题的手册就是先按一级标题分大块,再在块内按段落切,效果比单纯按字符好不少。你那个长短段落混杂的问题,可以在切之前做个合并,把短于100字的段落跟前后的拼一下,能减少很多噪声片段。rerank那块,bge-reranker-base对语义相近但字面重合的噪声区分度一般,可以试试换large版本或者加个分数阈值过滤掉低分的。另外faiss本身是纯向量检索,
一次生成能跑的基本靠运气,我都是先让它列思路和伪代码,确认没问题再出代码,反而快很多。
2万份PDF单卡3090确实有点吃紧,BGE-large加reranker这套组合检索质量是稳,但显存和部署成本摆在那。其实可以试试bge-m3,一个模型同时出稠密和稀疏向量,省掉一套权重,再配个轻量reranker比如bge-reranker-base,效果掉不了多少。另外Qwen2.5做生成没问题,但别指望它兼职embedding,方向不一样。你们PDF是扫描件多还是原生文本?这个对切分策略影
512切太死,先加重叠试试,再不行就上rerank。
参数乱飞多半是模型对tool schema理解不够狠,光靠description和pydantic有时候真压不住。你可以试试把参数名直接写进tool名字里,比如get_weather_by_city,或者在description里给一两个few-shot示例,模型抄作业比理解规则强。另外agent的prompt里也得明确说“必须严格按schema传参”,别让它自由发挥。我上次换成function
这问题太常见了,Cursor的Composer模式确实有点“过度热情”,它训练数据里估计全是那种功能齐全的组件,所以默认就往复杂了写。你prompt里写“不要预览”其实作用有限,因为它会把否定词忽略掉,反而更关注“预览”这个关键词。我一般是用.cursorrules文件,在项目根目录写死规则,比如“只生成用户明确要求的功能,禁止添加任何UI扩展”,这样它每次生成前都会先读这个约束。另外可以试试在代
Tailwind的类名顺序和条件渲染确实是AI生成的重灾区,我一般会要求它先只写结构,样式部分留空或者写TODO,然后单独一轮再补className,这样它不容易把逻辑和样式搅在一起。另外系统提示里光写“遵循现有风格”太虚了,最好直接贴两三个你项目里的组件示例给它当参照。至于自定义规则,我试过在.cursorrules里限定Tailwind的写法,比如禁止在条件里塞布局类,效果还行但也不是百分百。
top_k=10确实容易塞进太多噪音,我一般先砍到5再加重排。重排模型用bge-reranker-v2挺稳的,比单纯调阈值靠谱多了。另外可以把检索结果按文档来源或标题做一下聚合,同一主题的只留最高分那几段,能过滤掉不少边缘内容。embedding模型如果预算够可以换,但重排的性价比更高,先加上试试看。
TF的Tensor更像静态图的节点,设计上就绑定了图执行,所以不加@tf.function就是eager模式慢得一批。PyTorch的Tensor本质就是个带autograd的n维数组,动态图是天然属性,写起来当然顺手。你说的转换问题,torch→numpy如果CPU上共享内存基本零拷贝,但numpy→tf.Tensor一定会复制,因为TF有自己的内存管理。底层其实都是连续内存块加stride,差
双卡3090跑7B还OOM有点怪,先查下是不是没开gradient checkpointing,或者模型加载时没指定device_map。
MCP本身不解决格式解析,它更像是个“调度层”,把工具和模型连起来。你完全可以让MCP去调Tika或Unstructured的接口,格式转换的活还是那些解析器干。我之前试过用MCP挂Unstructured,PPT和扫描件走OCR没问题,但.eml得自己再包一层。所以关键不是MCP能不能,而是你愿不愿意多写个适配器。
我之前也卡在这个问题上折腾了大半天,最后发现是配置文件里command路径写成了相对路径,Claude Desktop根本不认,换成绝对路径就通了。你日志里的unexpected EOF大概率是进程启动后立刻挂了,可以去Claude的日志目录翻一下mcp-server开头的log,里面一般会有更具体的报错。Node版本v18其实够用,但要注意有些MCP server包要求用npx直接拉最新版,而不
我最近也在踩这个坑,说下目前试下来比较管用的做法:把工具调用记录单独拎出来用结构化存,每轮只把当前任务相关的工具结果重新注入,别把所有历史都往里堆。另外维护一个独立的slot memory存用户偏好和已确认的状态,摘要只用来压缩闲聊部分,关键字段绝不走摘要。LangGraph的checkpoint机制配合状态机挺适合这种场景,可以把每轮的工具输入输出挂在graph state上,比硬塞prompt
其实你PyTorch已经跑通ResNet了,说明工程链路没问题,这时候硬切TF反而容易两头不讨好。招聘里写TF的多是工业部署老项目,但真做图像研究和新模型,PyTorch生态现在明显更活跃。我建议主力留PyTorch,花个周末用TF2+Keras复现一遍你的分类项目,能看懂就行,没必要深到源码级。面试被问到TF就聊Keras高层API和SavedModel导出,够用了。
我之前也踩过类似的坑,后来发现核心问题不是LangGraph本身,而是把“路由”和“执行”的边界搞混了。我现在的做法是让路由Agent只做意图分类,绝不让它直接调用下游工具,所有请求统一走一个调度层管理状态和超时,这样并发再高也不会互相抢活。另外建议你把连续追问拆成独立会话ID处理,别让状态在一个图里无限叠加,否则迟早卡死。你现在的图结构是每个Agent都共享全局State,还是各自维护局部状态?
这问题我熟,之前调Qwen写脚本也老翻车。后来发现关键是把约束拆成单步指令,比如先让它只写函数签名和docstring,再单独补异常处理,最后再让合并,比一次给全要求靠谱得多。另外可以在prompt里塞一个你手写的错误示例,明确告诉它“别漏这个”,模型对比着学反而更听话。不过说实话,Llama 3对长指令的遵循能力确实弱一些,换新版或者干脆用API可能更省心。
我之前也卡在这过,后来发现是stdio server的启动路径问题,Claude Desktop调用时用的工作目录和终端不一样,导致它找不到Ollama的环境变量。你试试在server脚本里硬编码Ollama的host和port,别用默认的localhost,有时候IPv6解析会坑你。另外检查下Claude Desktop的权限设置,macOS上它可能被沙盒限制了网络访问,这个最容易忽略。
这问题太典型了,八成不是type写错,是Chroma那边metadata的存储方式和MCP的filter语法没对上。Chroma默认把metadata当扁平dict存,但MCP的schema要求显式声明每个field,你光在entity里定义还不够,field那块得单独把source和page列出来,而且page得设成integer类型,不然过滤时类型不匹配直接返回空。我之前也卡这儿好久,后来干脆
说实话我最近也踩过类似的坑,bge系列对长文本的分块其实挺敏感的,500字可能把多个主题塞进一个向量里了,导致语义被平均掉。你可以试试按语义边界切分,或者用父子分块,先召回小块再映射到大块。另外余弦分数差距不大很正常,因为topK本来就容易选到相近但不相关的,建议加一个重排环节,用cross-encoder过滤一下,效果会明显很多。