从API访问的角度看,向量库与大模型一样,都可以直接通过对应的对象直接进行配置和查询,检索器是访问向量数据库基础之上的进一步的抽象,把常见的访问向量数据复杂的功能封装在检索中,简化使用者的使用。

一、整体概念梳理(API 访问视角)

1. 核心结论

  1. 向量数据库、大模型:各自独立提供 SDK/API,都遵循 实例化对象 → 配置参数 → 调用查询方法 的编程范式,外部调用形态高度相似。
  2. 检索器(Retriever)基于向量库做的上层抽象封装,将「文本向量化、参数拼装、结果解析、过滤排序」等重复复杂逻辑内置,对外暴露极简接口,降低开发成本。
  3. 层级关系: 原始向量库对象(底层)检索器 Retriever(上层封装) 大模型对象 与向量库体系平级独立,仅业务上常和检索器组合使用。

2. 核心差异概括

  • 原生向量库:能力最全、自由度最高、代码繁琐,需手动处理向量化、向量查询、结果解析;
  • 检索器:屏蔽底层细节、接口统一、代码极简,面向业务快速开发;
  • 大模型:独立生成服务,调用逻辑和向量库形似,但底层是文本生成而非向量检索。

二、环境与依赖

以 Python + LangChain 生态为例(行业主流 RAG 开发框架),选用:

  • 向量库:Chroma(轻量本地向量库,无需额外部署)
  • 嵌入模型:OpenAI Embeddings
  • 大模型:OpenAI LLM
  • 检索器:LangChain 标准 Retriever 抽象

安装依赖:

bash

运行

pip install langchain langchain-openai chromadb

三、示例 1:直接使用「原生向量库对象」(底层直连,完整手动流程)

不走检索器,直接操作 Chroma 向量库原生对象,完整展示底层复杂步骤

代码实现

python

运行

from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma

# ===================== 1. 初始化配置 & 底层对象 =====================
# 1.1 初始化嵌入模型(文本转向量)
embedding = OpenAIEmbeddings()

# 1.2 初始化原生向量库对象(直连向量库,底层API)
vector_store = Chroma(
    collection_name="knowledge_base",  # 向量集合名
    embedding_function=embedding,      # 绑定向量化函数
    persist_directory="./chroma_db"    # 本地持久化目录
)

# 写入测试文档(模拟入库知识库)
docs = [
    "向量数据库用于存储文本向量,实现语义检索",
    "检索器是向量库的上层封装,简化调用逻辑",
    "大模型基于语义理解生成全新文本内容"
]
vector_store.add_texts(texts=docs)

# ===================== 2. 原生向量库查询:全手动流程(复杂) =====================
query = "检索器的作用是什么?"

# 步骤1:手动将问句转为向量(底层必做步骤)
query_vector = embedding.embed_query(query)

# 步骤2:手动调用向量库原生检索API,拼装参数
# k=3:返回Top3相似结果;可额外加过滤、距离阈值等复杂参数
raw_results = vector_store._collection.query(
    query_embeddings=[query_vector],
    n_results=3
)

# 步骤3:手动解析底层原始返回结果(结构复杂,需自行提取文本)
print("===== 原生向量库 原始返回数据 =====")
print(raw_results)

# 手动提取文档内容
print("\n===== 解析后的检索内容 =====")
for doc in raw_results["documents"][0]:
    print(doc)

特点说明

  1. 必须手动调用 Embedding 生成向量
  2. 需调用向量库底层 query 接口,手动配置检索参数;
  3. 返回是结构化原始数据(id、向量、分值、元数据),需要开发者手动解析;
  4. 灵活度最高,但代码冗余、重复工作量大。

四、示例 2:使用「检索器 Retriever」(向量库上层抽象,简化调用)

基于上面同一个 vector_store 对象,转为检索器,复用底层向量库,接口大幅简化。

代码实现

python

运行

from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma

# 1. 初始化(和原生向量库完全一致,一次配置)
embedding = OpenAIEmbeddings()
vector_store = Chroma(
    collection_name="knowledge_base",
    embedding_function=embedding,
    persist_directory="./chroma_db"
)

# 写入测试文档(复用上文数据)
docs = [
    "向量数据库用于存储文本向量,实现语义检索",
    "检索器是向量库的上层封装,简化调用逻辑",
    "大模型基于语义理解生成全新文本内容"
]
vector_store.add_texts(texts=docs)

# ===================== 核心:由向量库生成 检索器 Retriever =====================
# 一行代码完成上层抽象封装
retriever = vector_store.as_retriever(
    search_kwargs={"k": 3}  # 仅配置业务参数:召回数量
)

# ===================== 检索器查询:极简调用 =====================
query = "检索器的作用是什么?"
# 直接传入自然语言,内部自动完成:向量化 + 向量检索 + 结果解析
retriever_docs = retriever.get_relevant_documents(query)

# 直接拿到解析好的文档对象,无需手动处理向量、原始数据
print("===== 检索器 返回结果(封装后) =====")
for doc in retriever_docs:
    print(doc.page_content)

检索器封装了哪些复杂逻辑(对应原生步骤)

  1. 自动文本向量化内部调用 Embedding,不用手动生成向量;
  2. 自动拼装检索参数内置检索规则、相似度计算;
  3. 自动解析原始结果:统一封装为 Document 对象,直接读取 page_content
  4. 接口标准化:所有向量库(Milvus/FAISS/Pinecone)检索器都统一使用 get_relevant_documents

五、示例 3:独立使用「大模型对象」(平级组件,调用形式对比)

大模型和向量库 / 检索器调用范式一致(对象初始化 + 调用查询方法),但能力本质不同。

代码实现

python

运行

from langchain_openai import ChatOpenAI

# 1. 初始化大模型对象(独立配置,和向量库无依赖)
llm = ChatOpenAI(
    model="gpt-3.5-turbo",
    temperature=0  # 控制随机性
)

# 2. 调用问答接口:传入自然语言,返回生成文本
query = "简述检索器、向量库、大模型的区别"
resp = llm.invoke(query)

print("===== 大模型 问答结果 =====")
print(resp.content)

调用形态对比总结

  • 向量库原生对象:向量库实例 → 手动向量化 → 底层query → 手动解析
  • 检索器:检索器实例 → get_relevant_documents(文本) → 直接得到文档
  • 大模型:大模型实例 → invoke(文本) → 直接得到生成文本

三者代码调用风格统一,这也是直观感受 “用法相似” 的原因。


六、示例 4:工业标准组合:检索器 + 大模型(完整 RAG 链路)

检索器负责召回素材,大模型负责整合生成答案,体现分层协作。

python

运行

from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough

# 1. 初始化全套组件
embedding = OpenAIEmbeddings()
vector_store = Chroma(collection_name="knowledge_base", embedding_function=embedding)
llm = ChatOpenAI(model="gpt-3.5-turbo")

# 写入知识库
docs = [
    "向量数据库用于存储文本向量,实现语义检索",
    "检索器是向量库的上层封装,简化调用逻辑",
    "大模型基于语义理解生成全新文本内容"
]
vector_store.add_texts(texts=docs)

# 2. 转为检索器
retriever = vector_store.as_retriever(k=3)

# 3. 构造提示词模板
prompt = ChatPromptTemplate.from_template("""
基于下面参考内容回答问题:
{context}

问题:{question}
""")

# 4. 组装 RAG 链路:检索器召回 → 拼接上下文 → 大模型生成
rag_chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | prompt
    | llm
)

# 5. 执行问答
query = "检索器有什么作用?"
result = rag_chain.invoke(query)
print("===== RAG 最终答案 =====")
print(result.content)

七、总结(结合题干完整解读)

  1. 表层共性(API 调用) 向量库、大模型都以独立对象承载配置,统一使用「初始化对象 + 调用查询方法」,输入自然语言、输出文本,外部使用体验一致。

  2. 检索器的定位(核心抽象) 检索器不是新服务,是向量库的上层封装

    • 底层依然依赖原生向量库;
    • 把「文本向量化、向量查询、原始结果解析、参数管理」等复杂通用逻辑全部封装;
    • 对外提供极简标准接口,大幅降低业务开发难度。
  3. 层级与选型建议

    • 底层定制、深度调优:直接使用原生向量库对象
    • 常规 RAG、业务开发:优先使用检索器(框架标准方案);
    • 纯对话、推理、创作:独立使用大模型对象
    • 落地知识库问答:检索器 + 大模型 组合使用。
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐