Agent 30天速成|Day7 笔记 今日总学习目标替换Day3内存FAISS掌握Chroma持久化向量库本地磁盘落地、支持元数据过滤、MMR去重检索搭建多模态RAG图文统一向量空间、SigLIP图文嵌入、图片文本混合知识库检索扩展统一工具网关新增「图文检索工具」接入Day6 ReAct动态Agent打通完整多模态智能体链路文本对话图片检索计算器分层Redis记忆每日时长分配全天8h理论笔记阅读2.5h代码编写调试4h复盘面试背诵1.5h一、核心理论教学笔记Chroma向量库全解析替代FAISS1.1 FAISS痛点 Chroma优势Day3 FAISS仅内存存储重启丢失向量、无元数据、不支持过滤、无内置去重逻辑Chroma专为LLM RAG设计核心优势持久化本地磁盘程序重启向量不丢失开箱即用无需部署服务内置三层客户端内存临时、本地持久、远程服务异步客户端原生支持元数据过滤按文档来源、类型、上传时间筛选检索MMR最大边际相关性检索避免返回高度重复片段提升多样性统一Collection集合隔离文本库、图片库分开存储互不干扰同步/异步双API完美适配项目全异步架构1.2 Chroma三大客户端模式客户端类型 存储位置 适用场景EphemeralClient 内存 单元测试、临时调试PersistentClient 本地文件夹磁盘 单机本地知识库、学习项目AsyncHttpClient 远程Chroma服务 多实例分布式线上服务1.3 核心检索能力基础相似度检索返回文本/图片片段距离分数Metadata条件过滤filter{“type”:“image”,“source”:“产品手册”}MMR去重检索平衡相似度与多样性适合长文档问答批量增删改查支持文档/图片批量入库、指定ID删除2. 多模态RAG基础MM-RAG2.1 跨模态嵌入核心原理SigLIP传统文本Embedding只能编码文字SigLIP/CLIP构建统一共享向量空间图片输入 → 视觉编码器 → 图片向量文字描述/用户提问 → 文本编码器 → 文本向量语义相近的图文向量距离更近实现以文搜图、以图搜文双向检索2.2 多模态RAG完整流程知识库预处理文本分块、图片提取SigLIP向量存入同一Chroma集合附加typetext/image元数据用户输入文字/图片生成多模态向量Chroma跨模态相似度召回可过滤只返回图片或文本图文检索结果统一拼接进Prompt交由大模型结合图文信息回答2.3 多模态RAG解决的业务痛点手册截图、流程图、产品配图无法被纯文本RAG检索用户描述图片内容无法匹配对应图文资料图文混合知识库统一存储、统一检索不用两套向量库3. 多模态工具网关扩展在Day6网关基础上新增multimodal_search工具标准化输入query文字检索词图文通用search_typeall/text/image 三种检索模式top_k返回片段数量use_mmr是否开启去重检索网关统一封装SigLIP向量化、Chroma检索、元数据过滤逻辑上层ReAct Agent无需关心图文底层差异。今日完整串联链路整合前6天全部能力用户提问支持图文描述Redis读取分层记忆自动滑动窗口摘要压缩ReAct循环Thought-Action-ObservationThought判断是否需要检索图文知识库/数学计算Action调用统一工具网关计算器/多模态检索网关执行Chroma图文检索或计算返回Observation自我反思判断信息是否充足循环迭代汇总所有工具结果输出最终回答对话持久化存入Redis记忆二、今日学习重点Chroma持久化向量库增删改查、元数据过滤、MMR去重检索SigLIP本地图文嵌入模型调用实现跨模态向量生成扩展工具网关封装统一图文检索工具改造ReAct Agent支持自动调用多模态知识库对比FAISS与Chroma落地差异掌握生产级本地向量库选型三、今日难点 解决方案难点1SigLIP本地模型下载慢、CPU推理卡顿解决方案提前缓存模型权重到本地离线加载推理开启torch.no_grad()关闭梯度大幅提速学习阶段缩小图片尺寸降低算力消耗难点2图文向量混在一起检索大量无关图片/文本解决方案入库时添加type元数据区分图文工具支持search_type过滤按需只查文本/图片设置相似度分数阈值过滤低相关结果难点3Chroma持久化后向量膨胀、查询变慢解决方案按业务拆分多个Collection文本库、图片库分离定期清理过期无用文档释放向量存储检索开启MMR减少重复冗余片段难点4ReAct分不清何时该查文本、何时查图片解决方案System提示词明确规则描述图表/截图/产品配图调用image检索理论知识调用text检索Few-shot示例演示图文区分调用逻辑工具返回时区分图文来源模型下一轮可精准判断四、完整练习代码基于Day1~Day6扩展新增依赖安装pip install chromadb torch transformers pillow scikit-learn多模态向量库 chroma_mm_store.pyimport asyncioimport chromadbfrom chromadb.utils.embedding_functions import create_langchain_embeddingimport torchfrom PIL import Imagefrom transformers import AutoProcessor, AutoModelimport numpy as npfrom typing import List, Dict, Optional 1. SigLIP多模态嵌入本地模型 device “cuda” if torch.cuda.is_available() else “cpu”processor AutoProcessor.from_pretrained(“google/siglip-so400m-patch14-384”)siglip_model AutoModel.from_pretrained(“google/siglip-so400m-patch14-384”).to(device).eval()def text_to_vector(text: str) - List[float]:“”“文本转多模态向量”“”with torch.no_grad():inputs processor(texttext, return_tensors“pt”).to(device)vec siglip_model.get_text_embedding(**inputs)return vec.squeeze().cpu().numpy().tolist()def image_to_vector(img_path: str) - List[float]:“”“图片转多模态向量”“”img Image.open(img_path).convert(“RGB”)with torch.no_grad():inputs processor(imagesimg, return_tensors“pt”).to(device)vec siglip_model.get_image_embedding(**inputs)return vec.squeeze().cpu().numpy().tolist() 2. 持久化Chroma多模态向量库封装 class MultiModalChromaStore:definit(self, persist_path“./chroma_mm_db”, coll_name“mm_kb”):# 本地持久化客户端self.client chromadb.PersistentClient(pathpersist_path)self.collection self.client.get_or_create_collection(namecoll_name,metadata{“hnsw:space”: “cosine”} # 使用余弦相似度)# 批量插入文本 async def add_text(self, text_list: List[str], source: str 文档): ids [ftxt_{i} for i in range(len(text_list))] vecs [text_to_vector(t) for t in text_list] metas [{type: text, source: source} for _ in text_list] self.collection.add( embeddingsvecs, documentstext_list, metadatasmetas, idsids ) # 插入单张图片 async def add_image(self, img_path: str, desc: str, source: str 图片库): vec image_to_vector(img_path) self.collection.add( embeddings[vec], documents[desc], metadatas[{type: image, source: source, img_path: img_path}], ids[fimg_{img_path.replace(/,_)}] )