diff --git a/docs/feature-pic-design.md b/docs/feature-pic-design.md new file mode 100644 index 0000000..026fa43 --- /dev/null +++ b/docs/feature-pic-design.md @@ -0,0 +1,201 @@ +# 拍照提问模式 —— 设计方案 + +状态:**草案,未实现**。本文档只做设计,`feature_pic` 分支尚未修改任何业务代码。 + +## 1. 背景与目标 + +现有 `elec_rag_ui` 是纯文本 RAG 问答:用户打字提问 → 检索本地知识库 → llama-server 生成回答。 +本功能希望新增一种输入方式:**用摄像头拍一张照片,直接针对这张照片提问**(例如对着一个实物部件拍照问"这是什么型号"), +而不是先打字检索文档。 + +## 2. 关键前提核实(2026-09-03 现场查证,ER160 pad,192.168.31.48) + +### 2.1 摄像头硬件 —— 已具备,风险低 + +``` +/dev/video0/1 -> Hy-Usb2.0-1*MIC: Hy-QSXGA(8950) # 约500万像素 USB 摄像头,带麦克风 +/dev/video2/3 -> Hy-Usb2.0-2*MIC: Hy-8M(8079)-Ca # 约800万像素 USB 摄像头,带麦克风 +lsusb: 1bcf:2cef / 1bcf:2ce4 Sunplus Innovation Technology Inc. +``` + +两个都是标准 **USB UVC(USB Video Class)** 摄像头,不是需要专有 ISP 驱动的 CSI 摄像头。 +Chromium/Electron 的 `navigator.mediaDevices.getUserMedia()` 原生支持 UVC 设备,**不需要额外驱动或胶水代码**。 +一台设备接了两个摄像头,需要在 UI 里做设备选择(`enumerateDevices()` 列出后选 `deviceId`), +或者约定固定用其中一个(待确认哪个摄像头是安装时实际对外的那个)。 + +### 2.2 推理后端视觉能力 —— **当前不支持,是最大阻塞项** + +现场查询 er_backend(`http://127.0.0.1:17700/api/generate/status`),当前加载模型是文本模型, +llama-server 启动日志明确打印: + +``` +=model_desc = qwen35 9B Q4_0 +=allow_image = 0 +=allow_audio = 0 +=vision_width = 0 +=vision_height= 0 +``` + +跑在揽月 NPU 定制版 llama-server(`houmo-HLIELLama-xh2-2.1.0`)上。**`allow_image=0` 是运行时读出的模型能力, +不是配置开关**——要让这个后端接受图片输入,前提条件是: + +1. er_backend 那边要换成一个视觉多模态模型(如 Qwen2-VL / MiniCPM-V / LLaVA 系列的 GGUF + mmproj), + 且这个模型要能在揽月 NPU(HoumoNPU LQ50-24GB)上跑起来; +2. Houmo 这个定制版 llama-server 分支要支持 `--mmproj` 加载和 `/v1/chat/completions` 的 + `image_url` content-part 输入(这是 upstream llama.cpp 的能力,定制分支是否移植了未知); +3. 这两点都不是 `elec_rag_ui` 这个前端仓库能决定或实现的,需要跟 er_backend / 硬件适配团队确认。 + +**结论:这是一个跨团队依赖,不是前端待办项。** 在没有确认可用的视觉模型之前,前端这边能做的是把 +UI、拍照、请求组装、流式渲染这套壳子先搭好、可 mock 验证,等后端具备能力后接上真实模型联调。 + +## 3. 功能范围(建议先做 MVP) + +**MVP 包含:** +- 聊天输入区新增"拍照"入口,唤起摄像头取景 → 拍照 → 预览/重拍 → 确认 +- 确认后的照片作为一条用户消息的"附件",和文字问题一起发送 +- 复用现有流式回答渲染(think 块、逐字输出等现有 ChatPanel 能力不用改) +- 不做检索(不查向量库):拍照提问是纯粹的"图 + 文"直接对话,不掺 RAG 上下文 + +**明确不做(本期):** +- 不做"拍照 + 知识库联合检索"(比如拍照后再去匹配文档库里的相关图片/文字)——这需要图像 + embedding/CLIP 之类的能力,目前项目里完全没有这块基础设施,属于完全独立的大功能,先不纳入 +- 不做连续视频流分析,只做单张静态拍照 +- 不做照片持久化存储/历史相册(先按"用完即弃"设计,见 §6.5 的取舍说明) + +## 4. 用户体验流程 + +``` +[聊天界面输入框旁] 新增相机图标按钮 + │ 点击 + ▼ +[取景弹层] 全屏/半屏显示