前期知识回顾

Java程序员转大模型开发 基础篇
Java程序员转大模型开发 实战篇-rag系统连接redis


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言


本文将为大家介绍智能体开发中的关键组件——向量数据库。我们将从基本概念入手,系统地讲解向量数据库的定义、核心价值及应用场景。
提示:以下是本篇文章正文内容,下面案例可供参考

什么是向量数据库

向量数据库是大模型开发中用于存储外部信息的关键组件,其主要功能是通过语义相似性索引解决非结构化数据的"相似性检索"问题。

为什么要使用向量数据库

与传统Java开发中使用的结构化或非结构化数据库不同,向量数据库通过将非结构化数据转化为向量(Vector)/嵌入(Embedding)形式进行存储。这种存储方式的关键优势在于能够有效解决传统数据库难以处理的语义相似性问题。向量数据库支持余弦检索、距离检索等多种检索方式,可根据相似度返回查询结果。这一特性特别适用于为LLM语言模型提供对话时的上下文Prompt,从而帮助大模型更准确地输出预期结果。

向量数据库的几种检索方式

余弦检索

是在一个[-1~1]的余弦坐标系中两个信息通过转换后,箭头方向完全相同 → 相似度 = 1;方向完全相反 → 相似度 =-1;垂直 → 相似度 = 0,结果越趋近于1相似度越高

欧式检索

欧式检索(又称距离检索)是通过计算高维空间中两个向量之间的直线距离来衡量其相似度的方法。距离越小表示相似度越高,当距离为零时表示完全重合;反之,距离越大则相似度越低。简而言之,欧式距离与相似度呈反比关系:距离越小相似度越高,距离越大相似度越低。

chromadb向量数据库

ChromaDB 是一款轻量级、开源、专为 AI 应用设计的向量数据库,主打极简 API、开箱即用、本地优先,是构建 RAG、语义搜索、推荐系统 最常用的入门级向量库Chroma。

安装方式

pip install chromadb

演示代码

引入的chromadb 库

import config.models as models
import chromadb
from chromadb.config import Settings

1.创建一个向量数据库操作类MyVectorDBConnector, init 构造方法来```python
class MyVectorDBConnector:
def init(self, collection_name: str, chromadb_client):
“”"
初始化向量数据库连接器

    参数:
        collection_name: 要获取或创建的集合名称
        chromadb_client: 已初始化的chromadb客户端实例
    """
    self.collection = chromadb_client.get_or_create_collection(name=collection_name)

通过chromadb.Client获取一个数据库连接,chromadb_client.get_or_create_collection 方法来获取一个数据库的向量集合

2.采用向量化方法对数据进行转换后,通过 collection.add 方法将其存入向量数据库。其中:

documents 参数存储原始数据,便于查询时返回原内容
embeddings 参数存储向量化数据,用于高效的向量检索
ids 参数存储主键值

def add_documents(self,instructions,output):#添加文档
        # 为每个文档生成嵌入向量
        embeddings= self.embedding_fn(instructions)
        # 将文档和嵌入向量添加到集合中
        self.collection.add(
            documents=output,#原始文本(答案)
            embeddings=embeddings,#向量(问题生成)
            ids=[f"id{i}" for i in range(len(output))]
        )

3.通过collection.query方法查询向量数据库时,系统会先将查询问题向量化,生成query_embeddings。然后基于这些向量在embeddings数据中进行相似性搜索,最终返回查询结果。获取原始文档数据时,可通过results.get(“documents”)方法提取。

def search(self,query,k=5):
        results=self.collection.query(
            query_embeddings=self.embedding_fn([query]),#问题进行向量化,接受的是一个列表
            n_results=k#返回最相似的k个
        )

完整代码

class MyVectorDBConnector:
    def __init__(self, collection_name,embedding_fn):
        chromadb_client = chromadb.Client(Settings(allow_reset=True))#允许重置数据库
        chromadb_client.reset()
        # 从数据库中获取或创建一个集合
        self.collection = chromadb_client.get_or_create_collection(name=collection_name)   
        self.embedding_fn = embedding_fn#要做向量化的方法
    def add_documents(self,instructions,output):#添加文档
        # 为每个文档生成嵌入向量
        embeddings= self.embedding_fn(instructions)
        # 将文档和嵌入向量添加到集合中
        self.collection.add(
            documents=output,#原始文本(答案)
            embeddings=embeddings,#向量(问题生成)
            ids=[f"id{i}" for i in range(len(output))]
        )
    def search(self,query,k=5):
        results=self.collection.query(
            query_embeddings=self.embedding_fn([query]),#问题进行向量化,接受的是一个列表
            n_results=k#返回最相似的k个
        )
        return results
vector_db=MyVectorDBConnector("health_qa",get_embedding)
vector_db.add_documents(instruction,output)#将问题进行向量化并且和答案原文进行存储

总结

以上就是关于向量数据库的介绍,以及常见的连接方式。如有任何疑问,欢迎通过私信或留言的方式联系我。

Logo

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

更多推荐