Chromadb词向量数据库总结

简介

Chroma 词向量数据库是一个用于自然语言处理(NLP)和机器学习的工具,它主要用于词嵌入(word embeddings)。词向量是将单词转换为向量表示的技术,可以捕获单词之间的语义和语法关系,使得计算机能够更好地理解和处理自然语言。

Chroma 词向量数据库的主要功能和用途包括:

  1. 语义表示和相似度计算: 将单词转换为向量表示后,可以计算单词之间的相似度,找到在语义上相关的单词,从而支持词义的推断和理解。

  2. 词语聚类和分类: 使用词向量可以对单词进行聚类或分类,将具有相似含义的单词归为一类,从而帮助组织和理解词汇。

  3. 文本分类和情感分析: 词向量可以作为文本分类和情感分析任务的特征表示,有助于机器学习模型更好地理解文本内容和推断情感倾向。

  4. 推荐系统: 在推荐系统中,词向量可以用于理解用户的偏好和内容的语义,从而提供更准确的推荐。

  5. 语言生成和机器翻译: 词向量在语言生成和机器翻译任务中也有广泛应用,可以帮助模型生成更连贯和语义合理的文本。

Chroma 词向量数据库可能提供多种预训练模型,这些模型可以根据需求进行选择和应用,以支持各种自然语言处理任务。总的来说,它为研究人员和开发者提供了一个有用的工具,使他们能够利用词向量来处理自然语言数据并改善各种NLP任务的性能。

代码实践

安装chromadb

pip install chromadb

创建chromadb

import chromadb
chroma_client = chromadb.Client()

或者, 你想要把数据存放在磁盘上。

chroma_client = chromadb.PersistentClient(path="data")

创建collection

collection是您存储嵌入、文档以及任何额外元数据的地方。您可以使用名称创建一个collection.

collection = chroma_client.create_collection(name="my_collection")

或者

collection = chroma_client.get_or_create_collection(name="my_collection")

改变距离函数,默认是L2

collection = client.create_collection(
name="collection_name",
metadata={"hnsw:space": "cosine"} # l2 is the default
)
DistanceparameterEquation
Squared L2'l2'$d = \sum\left(A_i-B_i\right)^2$
Inner product'ip'$d = 1.0 - \sum\left(A_i \times B_i\right) $
Cosine similarity'cosine'$d = 1.0 - \frac{\sum\left(A_i \times B_i\right)}{\sqrt{\sum\left(A_i^2\right)} \cdot \sqrt{\sum\left(B_i^2\right)}}$

存储embedding, 文本,元数据,和id,

collection.add(
    embeddings=[[1.2, 2.3, 4.5], [6.7, 8.2, 9.2]],
    documents=["This is a document", "This is another document"],
    metadatas=[{"source": "my_source"}, {"source": "my_source"}],
    ids=["id1", "id2"]
)

根据词嵌入取数据

results = collection.query(
        query_embeddings=[[1.2, 2.3, 4.5]],
        n_results=2
    )

根据词嵌入和关键字取数据

results = collection.query(
        query_embeddings=[[1.2, 2.3, 4.5]],
        where_document={"$contains": "another"}
        n_results=2
    )

根据id取数据

results = collection.get(
        ids=["id1"]
    )

默认Chroma使用hugggingface里的all-MiniLM-L6-v2作为词向量模型。支持以下词向量模型

如果你不想要,直接用你自己的模型,就是在存数据之前调用你的模型把文本转成词向量。

比如我用tensorflowhub里面的。

nnlm | Kaggle

import tensorflow as tf
import tensorflow_hub as hub

def get_vectors(docs):
    url = "./ml/nnlm_embedding"
    s_embedding = hub.KerasLayer(url, input_shape=[], dtype=tf.string)
    doc_vectors = s_embedding(docs)
    return doc_vectors

参考

🔑 Getting Started | Chroma

### RAG 检索增强生成与向量数据库的结合实现 #### 背景介绍 RAG(Retrieval-Augmented Generation)是一种结合检索技术和生成模型的方法,旨在提升自然语言处理系统的性能。它通过引入外部知识源来弥补预训练语言模型可能存在的知识局限性或过时问题[^2]。 #### 向量数据库的作用 向量数据库作为 RAG 系统的核心组件之一,在存储和快速检索高维数据方面表现出色。这些数据库可以将文档或其他形式的数据转化为嵌入向量并高效管理它们,从而支持实时查询操作。例如 Chroma 是一种流行的开源向量数据库工具,适用于构建小型至中型项目中的语义搜索引擎[^1]。 #### Python 中基于 Chroma 的 RAG Bot 实现概览 下面展示了一个简单的 `RAG_Bot` 类设计思路及其主要组成部分: ##### 定义 RAG_Bot 类结构 该类封装了两个核心功能:一是创建用于保存文本片段表示形式的向量数据库;二是提供对话接口以便用户提问并通过调用内部逻辑完成答案生成过程。 ```python import chromadb from sentence_transformers import SentenceTransformer class RAG_Bot: def __init__(self, collection_name="default"): self.client = chromadb.PersistentClient(path="./chroma_db") self.collection = self._get_or_create_collection(collection_name) self.encoder_model = SentenceTransformer('all-MiniLM-L6-v2') def _get_or_create_collection(self, name): try: return self.client.get_collection(name=name) except ValueError: return self.client.create_collection(name) def createVectorDB(self, documents): embeddings = self.encoder_model.encode(documents).tolist() ids = [f"id_{i}" for i in range(len(documents))] metadatas = [{"source": f"doc{i}"} for i in range(len(documents))] self.collection.add( embeddings=embeddings, documents=documents, metadatas=metadatas, ids=ids ) def chat(self, query, n_results=3): embedding_query = self.encoder_model.encode([query]).tolist()[0] results = self.collection.query( query_embeddings=[embedding_query], n_results=n_results ) context = "\n".join(results['documents'][0]) prompt = f"Context:\n{context}\n\nQuestion:{query}" # Here you would integrate with your preferred LLM API to generate the response. generated_answer = "This is where an actual model call happens." return {"prompt": prompt, "answer": generated_answer} ``` 上述代码展示了如何初始化一个持久化的 Chroma 数据库实例,并定义了两种基本行为模式——即建立新的矢量化记录集以及执行交互式的问答会话流程。 #### 关键步骤解析 - **编码器加载**: 使用 HuggingFace 提供的 `sentence-transformers` 库加载预先训练好的句子编码器模型。 - **向量化入库**: 对输入的一批原始资料进行特征提取后存放到指定集合里。 - **上下文匹配**: 当接收到用户的询问时,先将其转化成对应的数值表达再寻找最相似的历史条目组合起来形成提示词交给下游的大规模神经网络去预测最终回复内容. #### 总结说明 此方案充分利用了现代机器学习框架和技术栈的优势,不仅简化了开发难度还提高了整体效率。不过需要注意的是实际部署过程中还需要考虑诸如安全性验证、错误处理机制等方面因素才能确保整个服务稳定可靠运行[^3]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

茫茫人海一粒沙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值