当前位置:   article > 正文

Chroma向量数据库使用案例_bge-large-zh-v1.5 下载

bge-large-zh-v1.5 下载

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

 总结:

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/494988
推荐阅读
相关标签
  

闽ICP备14008679号