面试知识库

BP20 · 图搜选购#

定位:面试官追问多模态接入、工具编排顺序、架构约束时的拷问预备。


核心口述(30 秒)#

“主模型是纯文本(deepseek),图不能进主 loop messages。解法是把图关在工具里——新增 image_understand 工具内调 VL 模型(qwen),主 loop 只看文本结论。关键发现:planner 是 Harness 确定性预跑的,如果看图晚于 planner,「只发一张图」会让 planner 拆出空白,全链路空转。改成有图先看图、再并入 planner,消息形状与真工具调用同构。不是以图搜图,是「看图说话再搜文本」——诚实标注。“


拷问链#

Q: 为什么不做真正的以图搜图?#

三个不可行:商品图是 Amazon CDN 外链(会挂/403)、138 万张图几百 GB 存储、无 GPU 做 CLIP 编码跑不完。走的是 VL 模型翻译成英文检索词 → 并入 BGE-M3 文本召回,零改 Qdrant。代价:给的是同品类相似品,不是同款复刻。可行折中:对 top-100 候选现场下图做视觉重排(100 张秒级),插在 reranker 之后,未做。

Q: 看图为什么必须先于 planner?#

planner 是 Harness 在 abefore_agent 里确定性预跑的(不占模型往返)。看图如果晚于它,「只发图不打字」的 query 会让 planner 在没看到图时拆字段——拆出空白,全链路空转。有图就得看,不需要模型决策,所以 Harness 预跑而非交给模型自己调。

Q: 为什么不把 image_url 直接给 provider 下载?#

实测 DashScope 拉 Amazon CDN 被 403 挡(Failed to download multimodal content)。改成服务端读盘转 base64 直传。何况用户上传的图本来就只在我们盘上,没有公网 URL。

Q: fork 子 Agent 怎么找到图?#

上传目录按 session_dir 而非 thread_id 定位。fork 子 Agent 有自己的 thread_id,uploaded/<子tid>/ 不存在。session_dir 是继承父的(项目既有约定),主/子 loop 才能读到同一份图。

Q: VL 调用的 token 怎么记账?#

工具内部的 LLM 调用不经 agent middleware 记账路径。必须挂 usage callback + charge_tool_llm_usage——否则成本闸和 M19 每日 credit 配额完全看不到图片 token。code-review 抓出的。

Q: 多主体消歧是什么?#

图里有多个物体时(如桌上放了手机和耳机),image_understand 如实枚举所有 objects,主 loop 按上下文决定要不要问用户「你想找哪个」——而非默认取最大的。


压力题#

Q: 图进了主 loop messages 会怎样?#

纯文本模型直接报错或静默忽略。即便换成多模态模型,图片几百 KB 会挤进后续每一轮 prompt,打断 prompt cache 前缀,成本和延迟都会炸。关在工具里是架构对的。