首页 > 数据库 >Chroma向量数据库使用案例

Chroma向量数据库使用案例

时间:2024-03-24 19:56:33浏览次数:30  
标签:text 数据库 Chroma collection 文档 paragraphs self 向量

 

转载自:https://blog.csdn.net/xzq_qzx_/article/details/136535125

​​​​​基于ChromaDB与BGEToward-VectorModel的本地私有化向量检索之路

安装基础环境

包括Python安装、pip安装及镜像设置等网上提供很多资料,这里就不介绍了。

  • 安装chromaDB环境安装
pip install chromadb
 
  • 安装pdf解析库
pip install pdfminer.six
 
  • 安装模型库
pip install sentence_transformers
 
  • 下载bge-large-zh-v1.5向量模型

如果能访问huggingface执行程序时自动下载,如果不能访问huggingface,请点击以下网盘链接进行下载:

链接:百度网盘 请输入提取码 提取码: fpej

手动下载模型需解压到项目工程目录,即与MyVectorDb.py在同一目录。

实践

在最后的环节,我们即将把理论化为实践。我们将用Python编写出一套基于chromadb向量数据库和bge-large-zh-v1.5向量模型实现本地向量检索的代码。

  • chromadb向量数据部分代码示例

引用

  1.   import chromadb
  2.   from chromadb.config import Settings

创建数据库对象

chroma_client = chromadb.Client(Settings(allow_reset=True))
 

创建一个 collection,即创建一个名为“demo”的数据库

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

向 collection 中添加文档与向量

  1.   collection.add(
  2.   embeddings= embedding_fn(documents), # 每个文档的向量,这里调用了向量模型,将文档转化成向量
  3.   documents=documents, # 文档的原文
  4.   ids=[f"id{i}" for i in range(len(documents))] # 每个文档的 id
  5.   )

检索向量数据库

  1.   collection.query(
  2.   query_embeddings=embedding_fn([query]), # 检索内容的向量,这里调用了向量模型,将文档转化成向量
  3.   n_results=top_n
  4.   )
  • beg模型代码示例

引入

from sentence_transformers import SentenceTransformer
 

创建模型

model = SentenceTransformer('BAAI/bge-large-zh-v1.5')
 

内容向量化embedding_fn

  1.   doc_vecs = [
  2.   model.encode(doc, normalize_embeddings=True).tolist()
  3.   for doc in documents
  4.   ]

完整源码:

  1.   import chromadb
  2.   from chromadb.config import Settings
  3.   from pdfminer.high_level import extract_pages
  4.   from pdfminer.layout import LTTextContainer
  5.   from sentence_transformers import SentenceTransformer
  6.    
  7.   class MyVectorDB:
  8.   '''
  9.   私有化向量数据库
  10.   \n作者:George
  11.   \n时间:2024年3月7日
  12.   '''
  13.    
  14.    
  15.   def __init__(self, collection_name):
  16.   chroma_client = chromadb.Client(Settings(allow_reset=True))
  17.   model = SentenceTransformer('BAAI/bge-large-zh-v1.5')
  18.    
  19.   # 为了演示,实际不需要每次 reset()
  20.   chroma_client.reset()
  21.    
  22.   # 创建一个 collection
  23.   self.collection = chroma_client.get_or_create_collection(name=collection_name)
  24.   self.bge_model = model
  25.    
  26.    
  27.   def add_documents(self, filename, page_numbers=None, min_line_length=1, metadata={}):
  28.   paragraphs = self.extract_text_from_pdf(filename, page_numbers, min_line_length)
  29.   '''向 collection 中添加文档与向量'''
  30.   self.collection.add(
  31.   embeddings=self.embedding_fn(paragraphs), # 每个文档的向量
  32.   documents=paragraphs, # 文档的原文
  33.   ids=[f"id{i}" for i in range(len(paragraphs))] # 每个文档的 id
  34.   )
  35.    
  36.   def search(self, query, top_n):
  37.   '''检索向量数据库'''
  38.   results = self.collection.query(
  39.   query_embeddings=self.embedding_fn([query]),
  40.   n_results=top_n
  41.   )
  42.   return results
  43.    
  44.   def embedding_fn(self, paragraphs):
  45.   '''文本向量化'''
  46.   doc_vecs = [
  47.   self.bge_model.encode(doc, normalize_embeddings=True).tolist()
  48.   for doc in paragraphs
  49.   ]
  50.   return doc_vecs
  51.    
  52.   def extract_text_from_pdf(self, filename, page_numbers=None, min_line_length=1):
  53.   '''从 PDF 文件中(按指定页码)提取文字'''
  54.   paragraphs = []
  55.   buffer = ''
  56.   full_text = ''
  57.   # 提取全部文本
  58.   for i, page_layout in enumerate(extract_pages(filename)):
  59.   # 如果指定了页码范围,跳过范围外的页
  60.   if page_numbers is not None and i not in page_numbers:
  61.   continue
  62.   for element in page_layout:
  63.   if isinstance(element, LTTextContainer):
  64.   full_text += element.get_text() + '\n'
  65.   # 按空行分隔,将文本重新组织成段落
  66.   lines = full_text.split('\n')
  67.   for text in lines:
  68.   if len(text) >= min_line_length:
  69.   buffer += (' '+text) if not text.endswith('-') else text.strip('-')
  70.   elif buffer:
  71.   paragraphs.append(buffer)
  72.   buffer = ''
  73.   if buffer:
  74.   paragraphs.append(buffer)
  75.   return paragraphs
  76.    
  77.    
  78.   if "__main__" == __name__:
  79.   # 创建一个向量数据库对象
  80.   vector_db = MyVectorDB("demo")
  81.   # 向向量数据库中添加文档
  82.   vector_db.add_documents("llama2.pdf", page_numbers=[
  83.   2, 3], min_line_length=10)
  84.    
  85.   user_query = "Llama 2有多少参数"
  86.   results = vector_db.search(user_query, 2)
  87.    
  88.   for para in results['documents'][0]:
  89.   print(para+"\n")

 总结:

这只是一个简单的演示样例,方便大家进一步理解和操作Chroma数据库,也希望大家一起进步,有问题也可以评论相互学习!

标签:text,数据库,Chroma,collection,文档,paragraphs,self,向量
From: https://www.cnblogs.com/wanghengbin/p/18092902

相关文章

  • 向量数据库Chroma极简教程
    向量数据库Chroma极简教程转载自:https://zhuanlan.zhihu.com/p/665715823引子向量数据库其实最早在传统的人工智能和机器学习场景中就有所应用。在大模型兴起后,由于目前大模型的token数限制,很多开发者倾向于将数据量庞大的知识、新闻、文献、语料等先通过嵌入(embeddi......
  • JDBC操作数据库
    packagecom.demo;importjava.sql.*;publicclassDemo{publicstaticvoidmain(String[]args)throwsClassNotFoundException,SQLException{//1、加载驱动Class.forName("com.mysql.jdbc.Driver");//2、创建连接(DriverManager驱......
  • 嵌入式数据库--SQLite
    目录1.SQLite数据库简介2.SQLite数据库的安装方式一: 方式二:3.SQLite的命令用法1.创建一个数据库 2.创建一张表3.删除表4.插入数据5.查询数据6.删除表内一条数据 7.修改表中的数据8.增加一列也就是增加一个字段1.SQLite数据库简介sqlite数据库是轻量化......
  • MySQL数据库——单表查询、连接查询、子查询
    头歌MySQL数据库代码、答案,单表查询、连接查询、子查询目录MySQL数据库— 单表查询(一)第一关:基本查询语句第二关:带IN关键字的查询 第三关:带BETWEENAND的范围查询MySQL数据库— 单表查询(二)第一关:带LIKE的字符匹配查询第二关:查询空值与去除重复结果 第三关:......
  • 数据库中什么时候使用自增id,什么时候不能使用
    在数据库中,自增ID的使用场景主要有以下几个:插入记录时不需要指定ID:使用自增ID可以避免手动指定ID,从而避免了因重复ID导致的错误数据库自动编号,速度快:数据库会按照预设的步长(默认为1)进行编号,这对于检索非常有利占用空间小,易于排序和传递:数字型的自增ID通常只占用4个字节,比字......
  • 智能停车场管理系统设计与实现|jsp+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档
    本项目包含可运行源码+数据库+LW,文末可获取本项目的所有资料。推荐阅读100套最新项目最新ssm+java项目文档+视频演示+可运行源码分享最新jsp+java项目文档+视频演示+可运行源码分享最新SpringBoot项目文档+视频演示+可运行源码分享2024年56套包含java,ssm,springboot的平台......
  • 医院预约挂号系统设计与实现|jsp+ Mysql+Java+ Tomcat(可运行源码+数据库+设计文档)
    本项目包含可运行源码+数据库+LW,文末可获取本项目的所有资料。推荐阅读100套最新项目最新ssm+java项目文档+视频演示+可运行源码分享最新jsp+java项目文档+视频演示+可运行源码分享最新SpringBoot项目文档+视频演示+可运行源码分享2024年56套包含java,ssm,springboot的平台......
  • 智能停车场管理系统设计与实现|jsp+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档
    本项目包含可运行源码+数据库+LW,文末可获取本项目的所有资料。推荐阅读100套最新项目最新ssm+java项目文档+视频演示+可运行源码分享最新jsp+java项目文档+视频演示+可运行源码分享最新SpringBoot项目文档+视频演示+可运行源码分享2024年56套包含java,ssm,springboot的平台......
  • 沙县小吃点餐系统|基于JSP技术+ Mysql+Java的沙县小吃点餐系统设计与实现(可运行源码+
    推荐阅读100套最新项目最新ssm+java项目文档+视频演示+可运行源码分享最新jsp+java项目文档+视频演示+可运行源码分享最新SpringBoot项目文档+视频演示+可运行源码分享2024年56套包含java,ssm,springboot的平台设计与实现项目系统开发资源(可运行源代码+设计文档)目录1.前......
  • Centos7虚拟机中oracle19c数据库安装
    目录[-]  1. Centos7虚拟机中oracle19c数据库安装1.1. 1.先诀条件1.2. 2.oracle19c安装准备(root用户下执行)1.3. 3.CentOS7上安装oracle19c1.先诀条件 本文在安装oracle19c时,各项oracle配置操作都通过图形界面进行。因此CentOS7系统需要安装gn......