惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
H
Help Net Security
Jina AI
Jina AI
V
V2EX
G
Google Developers Blog
B
Blog
GbyAI
GbyAI
U
Unit 42
爱范儿
爱范儿
腾讯CDC
Engineering at Meta
Engineering at Meta
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 三生石上(FineUI控件)
宝玉的分享
宝玉的分享
小众软件
小众软件
D
DataBreaches.Net
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - Franky
博客园 - 聂微东
The Cloudflare Blog
I
InfoQ
Microsoft Azure Blog
Microsoft Azure Blog
Hugging Face - Blog
Hugging Face - Blog
大猫的无限游戏
大猫的无限游戏

博客园 - 太一吾鱼水

室内物体语义类别 开放词汇分割 产权 图像和点云 安装MySQL8 大模型的能力 WSL使用 PyVista 知识图谱构建 Karpathy四大原则 AI问答:向量数据库本地化存储的方案? ArcGIS Pro连接PostgreSQL空间数据库 点云密度计算 Agent设计模式:Plan-and-Execute 氛围编程的一些体会 Agent Skills [AdvaGIS] 预测农作物产量 图片赋色方法学习 Claude code安装与GLM模型配置 ArcGIS Pro开发学习 视觉基础模型DINOv3 aliceVision_utils_split360Images 立体相机标定 SAM3使用 古建筑学习 ContextCapture无人机影像与激光点云融合建模感受 Randla-Net深入理解 ROC、PR曲线绘制 Zero-Shot、One-Shot、Few-Shot概念 损失曲线出现先下降后上升
向量数据库与嵌入模型
太一吾鱼水 · 2026-04-05 · via 博客园 - 太一吾鱼水

参考资料:

https://www.cnblogs.com/rude3knife/p/chroma_tutorial.html

https://cloud.tencent.com/developer/article/2418946

https://developer.aliyun.com/article/1664818

向量数据库其实最早在传统的人工智能和机器学习场景中就有所应用。在大模型兴起后,由于目前大模型的token数限制,很多开发者倾向于将数据量庞大的知识、新闻、文献、语料等先通过嵌入(embedding)算法转变为向量数据,然后存储在Chroma等向量数据库中。

当用户在大模型输入问题后,将问题本身也embedding,转化为向量,在向量数据库中查找与之最匹配的相关知识,组成大模型的上下文,将其输入给大模型,最终返回大模型处理后的文本给用户,这种方式不仅降低大模型的计算量,提高响应速度,也降低成本,并避免了大模型的tokens限制,是一种简单高效的处理手段。此外,向量数据库还在大模型记忆存储等领域发挥其不可替代的作用。

1. 向量存储(Vector Database/VectorStore)

是一种用于存储和检索高维向量数据的数据库或存储解决方案,它特别适用于处理那些经过嵌入模型转化后的数据。在向量数据库中,查询与传统关系数据库不同,它们执行相似性搜索,而不是精确匹配。当给定一个向量作为查询时,VectorStore返回与查询向量“相似"的向量。比如说在使用一个商城系统的向量数据库进行查询的时候,用户输入“北京”,其可能返回的结果会是 “中国、北京、华北、首都、奥运会” 等信息;输入“沈阳”,其返回结果可能会是“东北、辽宁、雪花、重工业”等信息。当然,返回的信息取决于向量数据库中存在的数据。用户可以通过参数的设置来限定返回的情况,进而适配不同的需求。

向量数据库用于将您的数据与Al模型集成。在使用它们时的第一步是将您的数据加载到向量数据库中。然后,当要将用户查询发送到AI模型时,首先检索一组相似文档。然后,这些文档作为用户问题的上下文,并与用户的查询一起发送到Al模型。这种技术被称为检索增强生(RetrievalAugmentedGeneration, RAG )。

说人话核心就是将文本、图像和视频等等转换为一组浮点数数组(即向量)后进行存储的系统就是向量数据库,其查询与传统关系数据库不同,向量数据库执行相似性搜索,而不是精确匹配。当给定一个向量作为查询时,向量数据库返回与查询向量“相似"的向量。

2. 嵌入模型(Embedding Model)

嵌入模型(Embedding Model)和向量数据库(Vector Database/Vector Store)是一对亲密无间的合作伙伴,也是 AI 技术栈中紧密关联的两大核心组件,两者的协同作用构成了现代语义搜索、推荐系统和 RAG(Retrieval Augmented Generation,检索增强生成)等应用的技术基础。

嵌入(Embedding)的工作原理是将文本、图像和视频转换为称为向量(Vectors)的浮点数数组。这些向量旨在捕捉文本、图像和视频的含义。嵌入数组的长度称为向量的维度(Dimensionality)。

嵌入模型(EmbeddingModel)是嵌入过程中采用的模型。当前EmbeddingModel的接口主要用于将文本转换为数值向量

3. Chroma 开源向量数据库

是一款轻量级向量数据库,专为基于向量嵌入空间相似性搜索的应用而设计。它包括一个对象存储层,以降低相似性搜索中向量索引的成本。

主流的向量数据库对比如下所示:https://docs.langchain4j.dev/integrations/embedding-stores/

image

向量数据库URLGitHub StarLanguage
chroma https://github.com/chroma-core/chroma 7.4K Python
milvus https://github.com/milvus-io/milvus 21.5K Go/Python/C++
pinecone https://www.pinecone.io/
qdrant https://github.com/qdrant/qdrant 11.8K Rust
typesense https://github.com/typesense/typesense 12.9K C++
weaviate https://github.com/weaviate/weaviate 6.9K Go

4. 简单实验

1.安装Chroma向量数据库

pip install chromadb

2.智谱清言提供了嵌入模型Embedding API:embedding-3

import os
from dotenv import load_dotenv, find_dotenv
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_community.document_loaders.pdf import PyPDFLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter

_ = load_dotenv(find_dotenv())

# 读取原始文档
# raw_documents_sanguo = TextLoader('/Users/rude3knife/Desktop/三国演义.txt', encoding='utf-16').load()
# raw_documents_xiyou = TextLoader('/Users/rude3knife/Desktop/西游记.txt', encoding='utf-16').load()

# # 分割文档
# text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=0)
# documents_sanguo = text_splitter.split_documents(raw_documents_sanguo)
# documents_xiyou = text_splitter.split_documents(raw_documents_xiyou)
# documents = documents_sanguo + documents_xiyou

loaders = [
    PyPDFLoader("D:/Users/yhexie/Downloads/三国演义.pdf"), # Duplicate documents on purpose - messy data
    PyPDFLoader("D:/Users/yhexie/Downloads/西游记.pdf"),

]
docs = []
for loader in loaders:
    docs.extend(loader.load())
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1500, chunk_overlap=150)
splits = text_splitter.split_documents(docs)
documents= splits
print("documents nums:", documents.__len__())


# 生成向量(embedding)
embeddings = OpenAIEmbeddings(
    model="embedding-3",
    openai_api_key=os.getenv("ZHIPUAI_API_KEY"),
    openai_api_base="https://open.bigmodel.cn/api/paas/v4/",
    chunk_size=50,  # 智谱 embedding 单次最多64条
)

db = Chroma.from_documents(documents, embedding=embeddings)

# 检索
query = "美猴王是谁?"
docs = db.similarity_search(query, k=5)

# 打印结果
for doc in docs:
    print("===")
    print("metadata:", doc.metadata)
    print("page_content:", doc.page_content)

image

image

image