大模型学习·第44天:Chroma向量数据库与RAG链式组装

一、Chroma 向量数据库

InMemoryVectorStore 存在内存中,重启程序就没了。Chroma 是轻量级外部向量数据库,数据持久化到磁盘,重启后依然可用。

bash 复制代码
pip install langchain-chroma chromadb
python 复制代码
from langchain_chroma import Chroma

vector_store = Chroma(
    collection_name="text",              # 类似数据库表名
    embedding_function=DashScopeEmbeddings(),
    persist_directory="./chroma_db"      # 数据持久化到本地文件夹
)

# 增删检索,和 InMemoryVectorStore 完全一样
vector_store.add_documents(documents=docs, ids=["id1", "id2"])
vector_store.delete(["id1", "id2"])
result = vector_store.similarity_search("查询", k=3, filter={"source": "黑马程序员"})

对比 :InMemoryVectorStore 适合学习和临时测试,Chroma 适合需要持久化的项目。两者接口完全一致,切换只需改创建代码。filter 参数支持按 metadata 字段过滤。

二、RAG 完整流程:检索 + 构建提示词 + 生成

python 复制代码
# 1. 准备向量库数据
vector_store.add_texts(["减肥就是要少吃多练", "控制卡路里摄入并运动起来", "跑步是很好的运动"])

# 2. 用户提问 → 检索相关文档
result = vector_store.similarity_search("怎么减肥?", k=2)

# 3. 拼接参考资料
reference_text = "[" + "".join([doc.page_content for doc in result]) + "]"

# 4. 构建提示词模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "以参考资料为主,简洁专业回答。参考资料:{context}"),
    ("user", "用户提问:{input}")
])

# 5. 链式调用
chain = prompt | model | StrOutputParser()
res = chain.invoke({"input": input_text, "context": reference_text})

RAG 本质:用户提问 → 向量检索匹配资料 → 资料 + 问题一同填入提示词 → 模型基于资料生成答案。整个流程的核心就是在向模型提问之前,先检索知识库确保信息精准。

三、RunnablePassthrough:自动传递数据

RunnablePassthrough 在链中起到"透传"作用------接收什么就原样传下去,主要用于在链式调用中传递用户原始输入,同时并行调用检索器获取上下文。

python 复制代码
from langchain_core.runnables import RunnablePassthrough

retriever = vector_store.as_retriever(search_kwargs={"k": 2})

chain = (
    {"input": RunnablePassthrough(), "context": retriever | format_func}
    | prompt | model | StrOutputParser()
)

res = chain.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个最相似文档。

今日核心总结

  1. Chroma :轻量级持久化向量数据库,与 InMemoryVectorStore 接口一致,切换只需改创建代码
  2. RAG 流程:用户提问 → 向量检索 → 拼接参考资料 → 填入提示词 → 模型生成答案
  3. as_retriever:把向量存储转为检索器对象,可直接加入 Chain
  4. RunnablePassthrough:透传用户输入,配合检索器并行获取上下文
  5. 数据流 :retriever 输入 str 输出 list[Document] → format_func 转为 str → prompt 接收 dict → 模型生成
相关推荐
Seraphina369 分钟前
SQL注入(二)盲注
网络·数据库·经验分享·笔记·sql
我命由我123451 小时前
Photoshop - Photoshop 矢量蒙版
学习·职场和发展·产品运营·求职招聘·职场发展·产品经理·photoshop
盟接之桥1 小时前
AI助手:你的7×24小时智能管家——让异常预警无处不在
大数据·网络·数据库·人工智能·制造·ai编程
waoooqwe1 小时前
问卷样本真实吗
大数据·数据库·算法·数据分析
熊猫钓鱼>_>2 小时前
越顺,越空:当 AI 把学习 “优化“ 到消失
人工智能·学习·ai·llm·agent·ai编程·metaai
可乐ea2 小时前
Agent 评测换判据:用终态数据库状态判定任务是否完成
数据库·ui·oracle·mcp工具·agent评测·终态断言·智能体可靠性
一条破秋裤2 小时前
02_注册设备号_从主次设备号到成对注销
学习
l1t2 小时前
DeepSeek总结的一个不含数据的 DuckDB 数据库
服务器·数据库·duckdb
@codercjw3 小时前
企业实战电机和传感器选型
学习
PaperData3 小时前
2007-2020年税收调查面板数据
数据库