omiGlass 图像描述(imageDescription)提示词体系:从多模型视觉标注到智能问答的完整实现
2026/9/16 20:41:00 网站建设 项目流程

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.tsomiGlass/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-fp16imageDescription函数的默认模型参数);
  • ####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批量生成的。脚本逻辑如下:

  1. 遍历prompts目录下的所有子目录(即series_1series_2等系列);
  2. 收集每个系列内全部.jpeg图片,输出目标路径为同名的.md文件;
  3. 依次对每张图片运行 4 轮测试,每轮调用imageDescription并指定不同视觉模型:
    • 默认模型(即moondream:1.8b-v2-fp16);
    • llava-llama3
    • llava:34b-v1.6
    • moondream:1.8b-v2-fp16(显式指定);
  4. 每轮结果以####模型名####分节写入.md文件。

这意味着:每一份series_1/img_*.md都是四模型横向对比的视觉标注记录,同一张图在 4 个视觉模型下的输出差异(表述详略、关注点、幻觉程度)可以直接横向阅读对比。脚本中还保留了被注释掉的 "Blurry"(模糊度检测)测试块,说明该数据集未来还规划过图像质量维度的标注能力,当前版本未启用。

1.3 配套图片与数据规模

每个系列均包含img_1.jpegimg_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-llama3llava:34b-v1.6moondream:1.8b-v2-fp16三个模型就是提示词数据集中实际使用并产生标注的三个视觉模型。其余为纯文本模型(llama3系列),可用于描述文本的进一步处理。这套设计说明:模型选择是可插拔的,只要 Ollama 上存在对应 tag,即可接入新的视觉模型。

三、底层调用链:Ollama 推理模块如何把图片送进模型

ollamaInference位于omiGlass/sources/modules/ollama.ts,是imageDescription的底层实现,其调用链如下:

  1. Base64 转换:对每条消息中的images: Uint8Array[]逐张调用toBase64,转换为 Ollama API 要求的 base64 字符串;
  2. 文本归一化:通过trimIdent去掉消息内容中多余的首尾缩进/空白,保证发送给模型的 prompt 干净整洁;
  3. HTTP 请求:使用 axios POST 到keys.ollama指向的地址(默认http://localhost:11434/api/chat,见 omiGlass/README.md),请求体包含:
    • stream: false——一次性返回完整结果,便于批量标注场景使用;
    • model——当前视觉模型 tag;
    • messages——转换后的多模态消息数组;
  4. 重试退避:整个请求被backoff包装,网络抖动或本地 Ollama 过载时自动重试,避免批量生成中断;
  5. 结果抽取:从响应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_KEYEXPO_PUBLIC_OLLAMA_API_URLEXPO_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()初始化音频上下文,为后续语音播报做准备。

AsyncLockomiGlass/sources/utils/lock.ts)保证多张照片的处理与问答串行执行,避免并发覆盖内部状态。

4.2 llamaFind 的系统提示词设计

llamaFind定义于omiGlass/sources/agent/imageDescription.ts,调用 Groq 的llama3-70b-8192(见groq-llama3.ts)。其系统提示词有 4 条硬性约束:

  1. 只依据描述回答:"read through description of the images and answer user's questions",输入的 images 是描述文本而非原始图片;
  2. 禁止提及图像本身:"DO NOT mention the images, scenes or descriptions in your answer, just answer the question"——回答保持纯粹,不暴露中间描述;
  3. 禁止泛化与脑补:"DO NOT try to generalize or provide possible scenarios",防止 LLM 基于常识补全画面中没有的信息;
  4. 简洁具体:"BE concise and specific"。

这四条规定直接呼应了提示词数据集的用途:img_*.md中那些多模型描述就是llamaFind的输入语料来源,约束越是严格,基于描述的回答就越忠实于画面事实、越少幻觉。

五、将提示词样本与源码串联:一条完整的视觉理解链路

结合以上分析,可以从img_38.md这个样本出发,还原出 omiGlass 从像素到答案的完整链路:

  1. 采集:omiGlass 眼镜(ESP32-S3 + 摄像头,见 omiGlass/firmware)拍下一帧画面;
  2. 标注generate.ts(离线批量)或Agent.addPhoto(运行时单张)将图片交给imageDescription,经由 Ollama 上的 moondream / llava 模型输出自然语言描述;
  3. 聚合:多条历史描述在 Agent 内部拼接为带索引的文本块;
  4. 问答llamaFind将用户问题与描述文本一起交给 Groq 的 llama3-70b,在四条约束下输出只基于画面的答案;
  5. 语音播报(可选):答案可通过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-fp16

6.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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询