omiGlass 图像描述(imageDescription)提示词体系:从多模型视觉标注到智能问答的完整实现
【免费下载链接】FriendAI that sees your screen, listens to your conversations and tells you what to do项目地址: https://gitcode.com/GitHub_Trending/fr/Friend
导读
本文基于开源智能眼镜项目 omiGlass(仓库根目录 omiGlass)中的图像描述提示词样本(omiGlass/prompts/series_1/img_38.md)展开,深入拆解该项目为"摄像头拍到什么就理解什么"所搭建的完整视觉理解管线:多视觉模型对同一帧画面的并行描述、描述文本的聚合问答(LLM 检索式回答)以及配套的底层实现(omiGlass/sources/agent/imageDescription.ts、omiGlass/sources/agent/Agent.ts)。读完本文,你将掌握 omiGlass 的提示词数据集结构与生成方式、imageDescription的系统提示词设计、各视觉模型(moondream / llava / llava-llama3)的调用参数,以及如何用llamaFind让 LLM 仅依据图像描述回答用户问题而不产生幻觉。
一、提示词样本是什么:一个"视觉描述数据集"的切片
1.1 样本文件的结构
omiGlass/prompts/series_1/img_38.md是对一张真实拍摄照片(对应同目录下img_38.jpeg)的多模型标注结果。文件采用####标题####分节格式,每一节记录一个模型的输出:
####Description####:默认描述,来自moondream:1.8b-v2-fp16(imageDescription函数的默认模型参数);####Description (llava-llama3)####:Ollama 上的llava-llama3模型输出;####Description (llava:34b-v1.6)####:Ollama 上的llava:34b-v1.6模型输出;####Description (moondream:1.8b-v2-fp16)####:显式指定 moondream 模型的输出。
以img_38.md为例,画面内容是一名男子站在开阔空间内仰头看向天花板,背景中有工业横梁、窗户与蓝天绿树;不同模型给出了风格各异的描述——默认描述侧重"动作 + 表情"(仰头、微笑、滑稽表情),llava-llama3 侧重"建筑结构 + 人物情感"的文学化叙述,llava:34b-v1.6 侧重"人物外观 + 环境光线",moondream 则给出最直白的"工业建筑 + 仰望"陈述。这种多模型并存的数据形态,正是后续"描述聚合问答"的输入基础:同一帧画面,多视角描述可以相互补足信息缺口。
1.2 数据集是如何生成的
这些.md文件并非手工撰写,而是由脚本omiGlass/prompts/generate.ts批量生成的。脚本逻辑如下:
- 遍历
prompts目录下的所有子目录(即series_1、series_2等系列); - 收集每个系列内全部
.jpeg图片,输出目标路径为同名的.md文件; - 依次对每张图片运行 4 轮测试,每轮调用
imageDescription并指定不同视觉模型:- 默认模型(即
moondream:1.8b-v2-fp16); llava-llama3;llava:34b-v1.6;moondream:1.8b-v2-fp16(显式指定);
- 默认模型(即
- 每轮结果以
####模型名####分节写入.md文件。
这意味着:每一份series_1/img_*.md都是四模型横向对比的视觉标注记录,同一张图在 4 个视觉模型下的输出差异(表述详略、关注点、幻觉程度)可以直接横向阅读对比。脚本中还保留了被注释掉的 "Blurry"(模糊度检测)测试块,说明该数据集未来还规划过图像质量维度的标注能力,当前版本未启用。
1.3 配套图片与数据规模
每个系列均包含img_1.jpeg至img_38.jpeg(共 38 张)以及对应的img_*.md文件,全部位于omiGlass/prompts/series_1/。该目录是理解 omiGlass "屏幕即输入"理念的入口:眼镜端拍摄的照片,经由这套标注体系转化为结构化文本,再交给上层 Agent 进行推理问答。
二、核心实现:imageDescription 与它的系统提示词
2.1 函数签名与默认值
imageDescription定义于omiGlass/sources/agent/imageDescription.ts:
export async function imageDescription(src: Uint8Array, model: KnownModel = 'moondream:1.8b-v2-fp16'): Promise<string> { return ollamaInference({ model: model, messages: [{ role: 'system', content: 'You are a very advanced model and your task is to describe the image as precisely as possible. Transcribe any text you see.' }, { role: 'user', content: 'Describe the scene', images: [src], }] }); }要点:
- 默认模型为
moondream:1.8b-v2-fp16,即轻量级视觉语言模型,与 omiGlass/README.md 中"ollama pull moondream:1.8b-v2-fp16"的安装指引一致; - 系统提示词(system prompt)要求模型"尽可能精确地描述图像,并转写所见到的任何文字"。这是 omiGlass 视觉管线的关键设计:不仅描述场景,还要逐字转写画面中的文本(屏幕、告示、名片上的文字),因为眼镜的典型使用场景是"看着屏幕提问";
- 用户提示词固定为
Describe the scene,保持提示词输入的最小化,避免引入与模型能力无关的干扰; - 图片以
Uint8Array二进制形式传入,由底层模块负责转码。
2.2 支持的模型集合(KnownModel)
omiGlass/sources/modules/ollama.ts中定义了完整的可用模型联合类型:
export type KnownModel = | 'llama3' | 'llama3-gradient' | 'llama3:8b-instruct-fp16' | 'llava-llama3' | 'llava:34b-v1.6' | 'moondream:1.8b-v2-fp16' | 'moondream:1.8b-v2-moondream2-text-model-f16'其中llava-llama3、llava:34b-v1.6、moondream:1.8b-v2-fp16三个模型就是提示词数据集中实际使用并产生标注的三个视觉模型。其余为纯文本模型(llama3系列),可用于描述文本的进一步处理。这套设计说明:模型选择是可插拔的,只要 Ollama 上存在对应 tag,即可接入新的视觉模型。
三、底层调用链:Ollama 推理模块如何把图片送进模型
ollamaInference位于omiGlass/sources/modules/ollama.ts,是imageDescription的底层实现,其调用链如下:
- Base64 转换:对每条消息中的
images: Uint8Array[]逐张调用toBase64,转换为 Ollama API 要求的 base64 字符串; - 文本归一化:通过
trimIdent去掉消息内容中多余的首尾缩进/空白,保证发送给模型的 prompt 干净整洁; - HTTP 请求:使用 axios POST 到
keys.ollama指向的地址(默认http://localhost:11434/api/chat,见 omiGlass/README.md),请求体包含:stream: false——一次性返回完整结果,便于批量标注场景使用;model——当前视觉模型 tag;messages——转换后的多模态消息数组;
- 重试退避:整个请求被
backoff包装,网络抖动或本地 Ollama 过载时自动重试,避免批量生成中断; - 结果抽取:从响应
response.message.content中取出文本并再次trimIdent返回。
密钥配置集中管理在omiGlass/sources/keys.ts:
export const keys = { groq: process.env.EXPO_PUBLIC_GROQ_API_KEY ?? '', ollama: process.env.EXPO_PUBLIC_OLLAMA_API_URL ?? '', openai: process.env.EXPO_PUBLIC_OPENAI_API_KEY ?? '', };三个环境变量EXPO_PUBLIC_GROQ_API_KEY、EXPO_PUBLIC_OLLAMA_API_URL、EXPO_PUBLIC_OPENAI_API_KEY分别对应 Groq、Ollama、OpenAI 三个后端,在.env文件中配置(先cp .env.template .env,再填入密钥)。
四、从"描述"到"回答":llamaFind 的描述聚合问答
仅仅生成描述还不够,omiGlass 的 Agent 层实现了"先描述、后问答"的两阶段架构。
4.1 两阶段 Agent 流程
omiGlass/sources/agent/Agent.ts中的Agent类维护了一个照片-描述缓存(#photos: { photo, description }[]),其工作流为:
- 阶段一(addPhoto):每当设备传入新照片(
addPhoto(photos)),在AsyncLock串行锁内逐张调用imageDescription(p)生成描述并缓存,同时更新 UI 状态lastDescription; - 阶段二(answer):用户提问时,
answer(question)先把历史照片的描述拼接成Image #0 ... Image #N的文本块,再调用llamaFind(question, combined)让 LLM 基于这些描述回答问题;回答前还会调用startAudio()初始化音频上下文,为后续语音播报做准备。
AsyncLock(omiGlass/sources/utils/lock.ts)保证多张照片的处理与问答串行执行,避免并发覆盖内部状态。
4.2 llamaFind 的系统提示词设计
llamaFind定义于omiGlass/sources/agent/imageDescription.ts,调用 Groq 的llama3-70b-8192(见groq-llama3.ts)。其系统提示词有 4 条硬性约束:
- 只依据描述回答:"read through description of the images and answer user's questions",输入的 images 是描述文本而非原始图片;
- 禁止提及图像本身:"DO NOT mention the images, scenes or descriptions in your answer, just answer the question"——回答保持纯粹,不暴露中间描述;
- 禁止泛化与脑补:"DO NOT try to generalize or provide possible scenarios",防止 LLM 基于常识补全画面中没有的信息;
- 简洁具体:"BE concise and specific"。
这四条规定直接呼应了提示词数据集的用途:img_*.md中那些多模型描述就是llamaFind的输入语料来源,约束越是严格,基于描述的回答就越忠实于画面事实、越少幻觉。
五、将提示词样本与源码串联:一条完整的视觉理解链路
结合以上分析,可以从img_38.md这个样本出发,还原出 omiGlass 从像素到答案的完整链路:
- 采集:omiGlass 眼镜(ESP32-S3 + 摄像头,见 omiGlass/firmware)拍下一帧画面;
- 标注:
generate.ts(离线批量)或Agent.addPhoto(运行时单张)将图片交给imageDescription,经由 Ollama 上的 moondream / llava 模型输出自然语言描述; - 聚合:多条历史描述在 Agent 内部拼接为带索引的文本块;
- 问答:
llamaFind将用户问题与描述文本一起交给 Groq 的 llama3-70b,在四条约束下输出只基于画面的答案; - 语音播报(可选):答案可通过
textToSpeech(OpenAItts-1+nova音色)转为语音播放。
img_38.md中 4 段描述之间的信息互补(例如 llava-llama3 补充了"建筑横梁 + 窗外树木"的细节,moondream 补充了"工业建筑"的环境判断),正是这一链路能够稳定工作的原因:单一模型的描述可能有盲区,多模型描述聚合后用 LLM 推理,可以显著降低漏检与误判。
六、在 omiGlass 中实际使用这套能力
6.1 环境准备(与数据集生成一致的前提)
按照 omiGlass/README.md 的软件设置步骤:
git clone https://github.com/BasedHardware/omi.git cd omi/omiGlass npm install # 或 yarn install cp .env.template .env在.env中填入:
EXPO_PUBLIC_GROQ_API_KEY(Groq 控制台 获取);EXPO_PUBLIC_OPENAI_API_KEY(OpenAI 平台获取);EXPO_PUBLIC_OLLAMA_API_URL(默认http://localhost:11434/api/chat)。
安装视觉模型:
ollama pull moondream:1.8b-v2-fp166.2 复现数据集生成
安装依赖后,在仓库根目录(或 omiGlass 目录)运行npx ts-node omiGlass/prompts/generate.ts(或yarn ts-node omiGlass/prompts/generate.ts),脚本会自动遍历prompts/series_*下的全部.jpeg,用 4 个模型逐一生成描述并写入对应.md。运行前提:本地 Ollama 已启动且已ollama pull上述 3 个视觉模型 tag。
6.3 以编程方式调用
在自己的 TS/React Native 代码中可直接复用模块:
import { imageDescription, llamaFind } from '../sources/agent/imageDescription'; // 1. 生成单张图片描述(默认 moondream) const desc = await imageDescription(imageBytes); // 2. 让 LLM 基于多段描述回答 const answer = await llamaFind('画面里的人正在做什么?', `Image #0\n\n${desc}`);注意:imageDescription依赖本地 Ollama 服务(keys.ollama),llamaFind依赖 Groq API(keys.groq),两者均需先完成.env配置。
6.4 适用前提与限制
- 视觉推理全部依赖本地 Ollama,模型首次加载耗时与显存占用取决于机器配置,
stream: false意味着需要等待完整生成; llamaFind的输入是描述文本而非原图,回答质量上限受限于描述质量——这正是提示词数据集要求"尽可能精确描述并转写文字"的原因;- 若 Ollama 未运行或模型 tag 缺失,
imageDescription会因请求失败而抛出异常,批量生成脚本也会中断,请先确认ollama list中包含所需模型。
结语
omiGlass/prompts/series_1/img_38.md表面上只是一份多模型图像描述记录,实际上是 omiGlass "看屏问答"能力的数据基石:它定义了系统提示词的输出规范(精确描述 + 文字转写)、暴露了 4 个模型的标注差异,并直接服务于Agent → imageDescription → ollamaInference → llamaFind这条可复现的视觉理解链路。无论是想为智能眼镜类应用搭建自己的图像描述数据集,还是需要一套"描述聚合 + 约束问答"的轻量视觉 Agent 参考实现,omiGlass 的这套提示词与源码都值得直接对照研读。
【免费下载链接】FriendAI that sees your screen, listens to your conversations and tells you what to do项目地址: https://gitcode.com/GitHub_Trending/fr/Friend
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考