Skip to content

数据向量化

python版本

  • python 3.11

安装包

  • pip install langchain
  • pip install langgraph
  • pip install langchain-openai
  • pip install langchain_community
  • pip install langchain_huggingface
  • pip install langchain-text-splitters
  • python -m pip install huggingface-hub==0.36.1 transformers==4.41.2 sentence-transformers==2.7.0
  • pip install chromadb
  • pip install fastapi
  • pip install uvicorn

嵌入模型

进行数据向量化需要向量模型,常用的嵌入模型有:

模型参数量向量维度资源占用典型用途
all-MiniLM-L6-v2~22M384⭐ 很轻demo / 玩具
bge-small~100M384⭐⭐轻量检索
bge-base~300M768⭐⭐⭐实用
bge-m3~560M1024⭐⭐⭐⭐商用 / 多语言
e5-large~335M1024⭐⭐⭐英文为主
OpenAI text-embedding-3-large不公开3072⭐⭐⭐⭐云托管

商用的话,建议使用 bge-m3 模型,因为它在多语言任务上表现良好,且参数量适中。不过对于开发阶段来说就有些重了,因为运行时会先下载5~7G的模型文件,每次运行都非常占用内存和显存。

开发阶段可以使用更小的all-MiniLM-L6-v2,或其他轻量模型

  • model_name="BAAI/bge-small-zh-v1.5": 轻量中文为主(推荐)
  • model_name="intfloat/e5-base": 轻量英文为主

示例

向量化文件夹夏后缀为 .txt 的文件

python
# 导入必要的模块
import os  # 用于文件和目录操作
from dotenv import load_dotenv  # 用于加载环境变量

# 导入LangChain相关模块
from langchain_community.document_loaders import TextLoader  # 用于加载文本文件
# from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_community.vectorstores import Chroma  # 用于创建和管理向量数据库

from langchain_text_splitters import RecursiveCharacterTextSplitter


# 加载环境变量
load_dotenv()

# 全局变量定义
DATA_DIR = "data/txt_files"  # 存放文本文件的目录路径
DB_DIR = "vectordb"  # 存放向量数据库的目录路径

def ingest_txt():
  """
  处理文本文件并创建向量数据库的函数
  
  步骤:
  1. 读取指定目录下的所有txt文件
  2. 对文本进行切分,生成更小的文本块
  3. 使用DeepSeek API生成文本嵌入
  4. 将嵌入和文本块存储到Chroma向量数据库中
  """
  # 初始化文档列表
  documents = []

  # 遍历目录下的所有文件
  for file in os.listdir(DATA_DIR):
    # 只处理txt文件
    if file.endswith(".txt"):
      # 构建完整的文件路径
      file_path = os.path.join(DATA_DIR, file)
      # 创建文本加载器
      loader = TextLoader(file_path, encoding="utf-8")
      # 加载文件内容
      docs = loader.load()
      # 将加载的文档添加到文档列表中
      documents.extend(docs)
  
  # 打印读取到的文档数量
  print(f"读取到 {len(documents)} 个文档")

  # 文本切分
  # 创建递归字符文本切分器,设置切分大小和重叠部分
  splitter = RecursiveCharacterTextSplitter(
    chunk_size=900,  # 每个文本块的大小
    chunk_overlap=150  # 相邻文本块的重叠部分大小
  )
  # 对文档进行切分
  split_docs = splitter.split_documents(documents)
  # 打印切分后的文档数量
  print(f"切分后的文档数: {len(split_docs)}")
  embeddings = HuggingFaceEmbeddings(
    # model_name="BAAI/bge-m3"
    model_name="sentence-transformers/all-MiniLM-L6-v2"
  )

  # 创建向量数据库
  # 使用Chroma.from_documents方法,将切分后的文档和嵌入存储到向量数据库中
  db = Chroma.from_documents(
    split_docs,  # 切分后的文档
    embeddings,  # 生成的嵌入
    persist_directory=DB_DIR  # 向量数据库的存储目录
  )
  # 持久化向量数据库
  db.persist()
  # 打印向量库创建完成信息
  print(f"向量库创建完成!")


if __name__ == "__main__":
  """
  主函数入口
  当直接运行此脚本时,调用ingest_txt函数
  """
  ingest_txt()