公司动态
大模型学习·第44天:Chroma向量数据库与RAG链式组装
一、Chroma 向量数据库InMemoryVectorStore存在内存中重启程序就没了。Chroma是轻量级外部向量数据库数据持久化到磁盘重启后依然可用。pipinstalllangchain-chroma chromadbfromlangchain_chromaimportChroma vector_storeChroma(collection_nametext,# 类似数据库表名embedding_functionDashScopeEmbeddings(),persist_directory./chroma_db# 数据持久化到本地文件夹)# 增删检索和 InMemoryVectorStore 完全一样vector_store.add_documents(documentsdocs,ids[id1,id2])vector_store.delete([id1,id2])resultvector_store.similarity_search(查询,k3,filter{source:黑马程序员})对比InMemoryVectorStore适合学习和临时测试Chroma适合需要持久化的项目。两者接口完全一致切换只需改创建代码。filter参数支持按metadata字段过滤。二、RAG 完整流程检索 构建提示词 生成# 1. 准备向量库数据vector_store.add_texts([减肥就是要少吃多练,控制卡路里摄入并运动起来,跑步是很好的运动])# 2. 用户提问 → 检索相关文档resultvector_store.similarity_search(怎么减肥?,k2)# 3. 拼接参考资料reference_text[.join([doc.page_contentfordocinresult])]# 4. 构建提示词模板promptChatPromptTemplate.from_messages([(system,以参考资料为主简洁专业回答。参考资料:{context}),(user,用户提问:{input})])# 5. 链式调用chainprompt|model|StrOutputParser()reschain.invoke({input:input_text,context:reference_text})RAG 本质用户提问 → 向量检索匹配资料 → 资料 问题一同填入提示词 → 模型基于资料生成答案。整个流程的核心就是在向模型提问之前先检索知识库确保信息精准。三、RunnablePassthrough自动传递数据RunnablePassthrough在链中起到透传作用——接收什么就原样传下去主要用于在链式调用中传递用户原始输入同时并行调用检索器获取上下文。fromlangchain_core.runnablesimportRunnablePassthrough retrievervector_store.as_retriever(search_kwargs{k:2})chain({input:RunnablePassthrough(),context:retriever|format_func}|prompt|model|StrOutputParser())reschain.invoke(怎么减肥?)数据流详解RunnablePassthrough()把用户提问原样传入{input: ..., context: ...}retriever输入是用户提问字符串输出是list[Document]format_func把list[Document]转成拼接好的字符串prompt接收{input: str, context: str}输出完整提示词核心优势不需要手动调用invoke传参链会自动把数据流转到正确的位置。四、as_retriever 方法vector_store.as_retriever()把向量存储转成检索器Runnable接口子类可以直接加入链。参数search_kwargs{k: 2}指定检索返回前2个最相似文档。今日核心总结Chroma轻量级持久化向量数据库与InMemoryVectorStore接口一致切换只需改创建代码RAG 流程用户提问 → 向量检索 → 拼接参考资料 → 填入提示词 → 模型生成答案as_retriever把向量存储转为检索器对象可直接加入 ChainRunnablePassthrough透传用户输入配合检索器并行获取上下文数据流retriever 输入 str 输出list[Document]→ format_func 转为 str → prompt 接收 dict → 模型生成