












参考资料:
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限制,是一种简单高效的处理手段。此外,向量数据库还在大模型记忆存储等领域发挥其不可替代的作用。
是一种用于存储和检索高维向量数据的数据库或存储解决方案,它特别适用于处理那些经过嵌入模型转化后的数据。在向量数据库中,查询与传统关系数据库不同,它们执行相似性搜索,而不是精确匹配。当给定一个向量作为查询时,VectorStore返回与查询向量“相似"的向量。比如说在使用一个商城系统的向量数据库进行查询的时候,用户输入“北京”,其可能返回的结果会是 “中国、北京、华北、首都、奥运会” 等信息;输入“沈阳”,其返回结果可能会是“东北、辽宁、雪花、重工业”等信息。当然,返回的信息取决于向量数据库中存在的数据。用户可以通过参数的设置来限定返回的情况,进而适配不同的需求。
向量数据库用于将您的数据与Al模型集成。在使用它们时的第一步是将您的数据加载到向量数据库中。然后,当要将用户查询发送到AI模型时,首先检索一组相似文档。然后,这些文档作为用户问题的上下文,并与用户的查询一起发送到Al模型。这种技术被称为检索增强生(RetrievalAugmentedGeneration, RAG )。
说人话核心就是将文本、图像和视频等等转换为一组浮点数数组(即向量)后进行存储的系统就是向量数据库,其查询与传统关系数据库不同,向量数据库执行相似性搜索,而不是精确匹配。当给定一个向量作为查询时,向量数据库返回与查询向量“相似"的向量。
嵌入模型(Embedding Model)和向量数据库(Vector Database/Vector Store)是一对亲密无间的合作伙伴,也是 AI 技术栈中紧密关联的两大核心组件,两者的协同作用构成了现代语义搜索、推荐系统和 RAG(Retrieval Augmented Generation,检索增强生成)等应用的技术基础。
嵌入(Embedding)的工作原理是将文本、图像和视频转换为称为向量(Vectors)的浮点数数组。这些向量旨在捕捉文本、图像和视频的含义。嵌入数组的长度称为向量的维度(Dimensionality)。
嵌入模型(EmbeddingModel)是嵌入过程中采用的模型。当前EmbeddingModel的接口主要用于将文本转换为数值向量
是一款轻量级向量数据库,专为基于向量嵌入空间相似性搜索的应用而设计。它包括一个对象存储层,以降低相似性搜索中向量索引的成本。
主流的向量数据库对比如下所示:https://docs.langchain4j.dev/integrations/embedding-stores/

| 向量数据库 | URL | GitHub Star | Language |
|---|---|---|---|
| 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 |
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)



此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。