FEATURED · 精选文章

Supabase 实战:用 Amazon Titan 多模态嵌入与 Supabase Vector 构建以文搜图系统

发布时间 / 2026/9/7 15:23:25
来源 / 创域科博编辑部
栏目 / 资讯中心
Supabase 实战:用 Amazon Titan 多模态嵌入与 Supabase Vector 构建以文搜图系统 Supabase 实战用 Amazon Titan 多模态嵌入与 Supabase Vector 构建以文搜图系统【免费下载链接】supabaseThe Postgres development platform. Supabase gives you a dedicated Postgres database to build your web, mobile, and AI applications.项目地址: https://gitcode.com/GitHub_Trending/supa/supabase本文围绕仓库示例 examples/ai/aws_bedrock_image_search 展开演示如何利用 Amazon Titan Multimodal Embeddings G1amazon.titan-embed-image-v1将图片与文本编码到同一 1024 维向量空间并借助 Python 库vecs把向量写入 Supabase 的 Postgres 数据库完成以文搜图。读完后你将掌握多模态嵌入的完整落地链路从请求体构造、Base64 编码、向量集合Collection的创建与索引到带元数据过滤的相似度查询并能直接在本地 Supabase 或托管项目上复现。方案总览示例的核心思想是Titan Multimodal Embeddings G1 是 Amazon Bedrock 提供的托管多模态嵌入模型它既能消费图片inputImage也能消费文本inputText且两种输入生成的向量处于可比较的同一空间。示例程序 image_search/main.py 实现了两个方法seed对images目录下的图片逐张生成嵌入向量upsert 到 Supabase Vector 中的一个集合search将自然语言查询文本编码为向量执行向量相似度搜索并可视化返回的图片。images/*.jpg ──base64── Titan (inputImage) ── 1024 维向量 ──upsert── Postgres (vecs 扩展) │ 查询文本 ────────────── Titan (inputText) ── 1024 维向量 ──query(过滤/TopK)──┘ │ matplotlib 展示命中图片两条路径共用同一个模型 ID 与同一维度配置这是图片检索词能命中图片的关键。环境准备依赖与入口脚本项目的依赖声明在 pyproject.toml 中基于 Poetry 管理依赖版本约束作用python^3.10运行环境注意是 3.10而非 3.8vecs^0.4.3Supabase 官方 Python 向量库客户端封装vector扩展操作boto3^1.34.59AWS SDK用于调用 Bedrockinvoke_modelmatplotlib^3.7.1搜索结果可视化读取并展示命中的图片同文件还定义了两个可执行入口[tool.poetry.scripts] seed image_search.main:seed search image_search.main:search因此poetry run seed/poetry run search实际上是直接调用 main.py 中的seed()与search()函数这也是 README 中运行命令的由来。安装步骤pip install poetry # 安装 poetry poetry shell # 激活虚拟环境exit 退出 poetry install # 安装应用依赖Bedrock 客户端配置main.py 顶部创建了一个bedrock-runtime客户端需要替换为你自己的 AWS 凭据bedrock_client boto3.client( bedrock-runtime, region_nameus-west-2, # Titan 嵌入模型可用区域 aws_access_key_idreplace_your_own_credentials, aws_secret_access_keyreplace_your_own_credentials, aws_session_tokenreplace_your_own_credentials, )region_nameus-west-2是该示例的既定取值模型 ID 固定为amazon.titan-embed-image-v1。本地 Supabase 配置示例自带 supabase/config.toml关键字段如下project_id aws_bedrock_image_search区分同主机上不同本地项目[api] enabled false本示例不经过 PostgREST直接用 SQL 客户端写库故禁用 Data API[db] port 54322本地数据库端口与代码中默认的DB_CONNECTION postgresql://postgres:postgreslocalhost:54322/postgres对应[db] shadow_port 54320db diff命令初始化影子库所用[db] major_version 15本地 Postgres 主版本需与远程数据库保持一致远程可用SHOW server_version;核对[db.seed] enabled false本示例的数据由seed脚本写入不依赖 SQL seed 文件。seed生成图片嵌入并写入向量集合seed()的完整流程见 main.py 第 68-107 行vx vecs.create_client(DB_CONNECTION) images vx.get_or_create_collection(nameimage_vectors, dimension1024)vecs.create_client用 Postgres 连接串建立向量库客户端get_or_create_collection(nameimage_vectors, dimension1024)以不存在则创建的方式获取集合维度 1024 必须与模型输出维度一致由请求体中的outputEmbeddingLength决定。嵌入生成的三步封装代码把调用 Titan 拆成了三个小函数便于排查readFileAsBase64(file_path)读取图片字节并 Base64 编码文件不存在时打印bad file name并退出construct_bedrock_image_body(base64_string)按 Titan 多模态嵌入的 API 规范构造请求体{ inputImage: base64_string, embeddingConfig: {outputEmbeddingLength: 1024}, }get_embedding_from_titan_multimodal(body)调用bedrock_client.invoke_model从响应体中取出embedding数组返回。随后encode_image()把三步串起来对四张示例图片one.jpg、two.jpg、three.jpg、four.jpg逐一编码。这四张图位于 images/ 目录内容分别是葡萄串、田野中双脚视角、红砖墙前的自行车、手中的蒲公英。写入与建索引images.upsert( records[ (one.jpg, img_emb1, {type: jpg}), (two.jpg, img_emb2, {type: jpg}), (three.jpg, img_emb3, {type: jpg}), (four.jpg, img_emb4, {type: jpg}), ] ) images.create_index()upsert的每条记录是三元组向量 ID这里是文件名搜索命中后直接用它拼路径读图、向量本身、关联元数据。注意{type: jpg}这个元数据——它在 search 阶段会被用作过滤条件。create_index()为集合建立 ANN 索引向量索引用于加速相似度检索仓库中另一个姊妹示例 examples/ai/vector_hello_world.ipynb 还演示了create_index(measurevecs.IndexMeasure.cosine_distance)这种显式指定度量方式。search文本查询的编码与相似度检索search()的检索链路text_emb get_embedding_from_titan_multimodal(json.dumps( { inputText: query_term, embeddingConfig: {outputEmbeddingLength: 1024}, } ))这里复用了同一个invoke_model封装只是请求体从inputImage换成inputText。由于图片向量与文本向量来自同一模型、同一维度text_emb可以直接在image_vectors集合上比对。results images.query( datatext_emb, # 查询向量必填 limit1, # 返回记录数 filters{type: {$eq: jpg}}, # 元数据过滤 ) result results[0] plt.title(result) plt.imshow(mpimg.imread(./images/ result)) plt.show()几个实现细节值得注意query的data是查询向量limit控制 TopKfilters支持$eq这类操作符做元数据过滤避免跨类型误命中命中结果result就是 upsert 时写入的向量 ID文件名代码直接用它拼接./images/路径读图展示——这也解释了为什么 seed 阶段要用文件名而不是自增 ID命令行参数由sys.argv[1]接收即poetry run search your query中引号内的文本。本地运行supabase start # 启动本地 Supabase poetry run seed # 生成嵌入并写入 image_vectors poetry run search bike in front of red brick wallseed 完成后可在本地 Dashboardhttp://localhost:54323的 project/default/editor切到vecsschema检查写入的嵌入。上面的示例查询正是为数据集量身设计的bike in front of red brick wall 对应的是红砖墙前的自行车图连接到托管 Supabase 项目本地验证通过后把DB_CONNECTION改为托管项目的连接串即可默认值指向本地localhost:54322DB_CONNECTION postgresql://postgres:postgreslocalhost:54322/postgres连接串可在托管 Dashboard 的 Database Settings Connection string URI 处获取。从源码结构看向量数据全部落在 Postgres 的vector扩展之上vecsschema 即为证据因此托管项目需已启用该扩展其余链路无需改动。常见排查点Poetry 命令不存在确认已执行pip install poetry连接报错核对DB_CONNECTION端口本地 54322与凭据搜索无结果先确认已运行poetry run seed且索引已创建维度不匹配集合维度1024必须与outputEmbeddingLength保持一致换模型或改维度时需重建集合AWS 调用失败检查区域是否为us-west-2、凭据是否替换、账户是否开通该模型权限。模型与素材归属嵌入模型Amazon Titan Multimodal Embeddings G1amazon.titan-embed-image-v1Amazon Bedrock 托管 API示例图片来自 Unsplash 许可经 picsum.photos 分发。该示例与 examples/ai/image_search 形成对照后者使用 OpenAI CLIPclip-ViT-B-32在本地推理而本示例把嵌入计算完全托管给 Bedrock应用侧只保留向量存储与检索是外部嵌入模型 Supabase Vector组合的参考实现。【免费下载链接】supabaseThe Postgres development platform. Supabase gives you a dedicated Postgres database to build your web, mobile, and AI applications.项目地址: https://gitcode.com/GitHub_Trending/supa/supabase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻