ChromaDB02-代码实战

ChromaDB02-代码实战

运行ChromaDB向量数据库的过程中有遇到一些问题,在此记录过程中遇到的问题和解决办法,代码仓库:https://gitee.com/enzoism/kumi_chroma_db.git


1-核心知识

  • 1)如果我没有ChromaDB服务,我要怎么进行测试
    • 使用【内存模式】进行测试
    • 使用【持久化模式】进行测试
  • 2)我安装了ChromaDB服务后,我要怎么进行测试->使用【客户端模式】进行测试
  • 3)向量数据库操作->涉及到embedding的方法
    • 使用假的embedding方法
    • 使用真的embedding方法->如何解决模型的下载问题

2-动手实操

1-ChromaDB内存模式

  • 直接连接ChromaDB进行数据【插入和 查询】
python 复制代码
import chromadb

try:
    # 方法1:使用默认配置连接(内存模式)
    client = chromadb.Client()
    print("✓ ChromaDB 内存模式连接成功")

    # 方法2:使用持久化存储(持久化模式)
    # client = chromadb.PersistentClient(path="./chroma_db")
    # print("✅ 已连接到 ChromaDB (使用持久化存储)")

    # 方法3:使用服务器配置连接(服务器模式)
    # client = chromadb.HttpClient(host='localhost', port=8000)
    # print("✓ 成功连接到 ChromaDB 服务器")

    # 创建测试集合
    collection = client.get_or_create_collection(name="test_collection_01")

    # 获取服务器版本信息
    version = client.get_version()
    print(f"服务器版本: {version}")

    # 列出所有集合
    collections = client.list_collections()
    print(f"当前集合数量: {len(collections)}-{collections}")

    # 添加测试数据
    collection.add(
        documents=["测试文档"],
        ids=["test_id_1"],
        metadatas={"source": "test"}
    )
    print(f"✓ 数据写入测试通过")

    # 查询验证
    results = collection.query(
        query_texts=["测试"],
        n_results=1
    )
    print(f"✓ 数据查询测试通过-{results}")

except Exception as e:
    print(f"✗ 连接测试失败: {e}")
  • 日志打印
shell 复制代码
✓ ChromaDB 内存模式连接成功
服务器版本: 1.4.0
当前集合数量: 1-[Collection(name=test_collection_01)]
✓ 数据写入测试通过
✓ 数据查询测试通过-{'ids': [['test_id_1']], 'embeddings': None, 'documents': [['测试文档']], 'uris': None, 'included': ['metadatas', 'documents', 'distances'], 'data': None, 'metadatas': [[{'source': 'test'}]], 'distances': [[0.9398118257522583]]}

2-ChromaDB持久化模式

  • 直接连接ChromaDB进行数据【插入和 查询】
python 复制代码
import chromadb

try:
    # 方法1:使用默认配置连接(内存模式)
    # client = chromadb.Client()
    # print("✓ ChromaDB 内存模式连接成功")

    # 方法2:使用持久化存储(持久化模式)
    client = chromadb.PersistentClient(path="./chroma_db")
    print("✅ 已连接到 ChromaDB (使用持久化存储)")

    # 方法3:使用服务器配置连接(服务器模式)
    # client = chromadb.HttpClient(host='localhost', port=8000)
    # print("✓ 成功连接到 ChromaDB 服务器")

    # 其他还是相同的代码,在此出省略。。。

3-ChromaDB客户端模式

  • 直接连接ChromaDB进行数据【插入和 查询】
python 复制代码
import chromadb

try:
    # 方法1:使用默认配置连接(内存模式)
    # client = chromadb.Client()
    # print("✓ ChromaDB 内存模式连接成功")

    # 方法2:使用持久化存储(持久化模式)
    # client = chromadb.PersistentClient(path="./chroma_db")
    # print("✅ 已连接到 ChromaDB (使用持久化存储)")

    # 方法3:使用服务器配置连接(服务器模式)
    client = chromadb.HttpClient(host='localhost', port=8000)
    print("✓ 成功连接到 ChromaDB 服务器")

    # 其他还是相同的代码,在此出省略。。。

4-ChromaDB向量写入

1-模拟embedding向量写入

python 复制代码
#!/usr/bin/env python3
"""
ChromaDB 最小化 Demo
演示 ChromaDB 的核心功能:创建集合、插入数据、向量查询
"""

import chromadb


def main():
    print("=" * 60)
    print("ChromaDB 最小化演示程序")
    print("=" * 60)

    # ========================================
    # 1. 连接到 ChromaDB 服务器
    # ========================================
    print("\n📡 步骤 1: 连接到 ChromaDB 服务器")
    print("-" * 60)

    # 方法1:使用默认配置连接(内存模式)
    # client = chromadb.Client()
    # print("✓ ChromaDB 内存模式连接成功")

    # 方法2:使用持久化存储(持久化模式)
    # client = chromadb.PersistentClient(path="./chroma_db")
    # print("✅ 已连接到 ChromaDB (使用持久化存储)")

    # 方法3:使用服务器配置连接(服务器模式)
    client = chromadb.HttpClient(host='localhost', port=8000)
    print("✓ 成功连接到 ChromaDB 服务器")

    # ========================================
    # 2. 创建集合(Collection)
    # ========================================
    print("\n📚 步骤 2: 创建集合")
    print("-" * 60)

    collection_name = "demo_knowledge_base"

    # 检查并删除已存在的集合
    try:
        client.delete_collection(name=collection_name)
        print(f"⚠️  已删除已存在的集合 '{collection_name}'")
    except:
        pass

    # 创建新集合
    collection = client.create_collection(
        name=collection_name,
        metadata={"description": "演示知识库"}
    )
    print(f"✅ 成功创建集合: {collection_name}")

    # ========================================
    # 3. 准备演示数据
    # ========================================
    print("\n📝 步骤 3: 准备演示数据")
    print("-" * 60)

    # 模拟的文档数据(实际应用中应使用真实的 embedding 模型)
    documents = [
        "Python 是一种高级编程语言,易学易用",
        "JavaScript 是 Web 开发的核心语言",
        "ChromaDB 是一个开源的向量数据库",
        "向量数据库用于存储和检索高维向量",
        "机器学习模型将文本转换为向量表示"
    ]

    # 为演示目的,使用简单的伪造向量(3维)
    # 实际应用中应使用 embedding 模型(如 OpenAI embeddings)
    embeddings = [
        [0.1, 0.2, 0.3],  # Python 文档的向量
        [0.4, 0.5, 0.6],  # JavaScript 文档的向量
        [0.7, 0.8, 0.9],  # ChromaDB 文档的向量
        [0.2, 0.3, 0.4],  # 向量数据库文档的向量
        [0.6, 0.7, 0.8],  # 机器学习文档的向量
    ]

    # 元数据
    metadatas = [
        {"category": "编程语言", "popularity": 10},
        {"category": "编程语言", "popularity": 9},
        {"category": "数据库", "popularity": 8},
        {"category": "数据库", "popularity": 7},
        {"category": "人工智能", "popularity": 9},
    ]

    # 文档 ID
    ids = ["doc1", "doc2", "doc3", "doc4", "doc5"]

    print(f"✅ 已准备 {len(documents)} 条文档")
    for i, doc in enumerate(documents, 1):
        print(f"   {i}. {doc}")

    # ========================================
    # 4. 插入数据到集合
    # ========================================
    print("\n➕ 步骤 4: 插入数据到集合")
    print("-" * 60)

    collection.add(
        documents=documents,
        embeddings=embeddings,
        metadatas=metadatas,
        ids=ids
    )
    print(f"✅ 成功插入 {len(documents)} 条文档到集合")

    # 显示集合统计信息
    count = collection.count()
    print(f"📊 集合中文档总数: {count}")

    # ========================================
    # 5. 向量查询
    # ========================================
    print("\n🔍 步骤 5: 执行向量查询")
    print("-" * 60)

    # MOCK查询向量(模拟查询"编程语言相关的内容")->当前的embedding是我mock的,不是真实计算的
    query_embedding = [[0.15, 0.25, 0.35]]  # 与 doc1 和 doc2 相似度较高

    # 执行查询
    results = collection.query(
        query_embeddings=query_embedding,
        n_results=3,  # 返回最相似的前 3 个结果
        include=["documents", "metadatas", "distances"]
    )

    print(f"✅ 查询完成,找到 {len(results['ids'][0])} 个相似结果")
    print("\n查询结果(按相似度排序):")

    for i in range(len(results['ids'][0])):
        doc_id = results['ids'][0][i]
        document = results['documents'][0][i]
        distance = results['distances'][0][i]
        metadata = results['metadatas'][0][i]

        # ChromaDB 使用 L2 距离,距离越小越相似
        similarity_score = 1 / (1 + distance)

        print(f"\n   📄 结果 #{i + 1}")
        print(f"      ID: {doc_id}")
        print(f"      内容: {document}")
        print(f"      类别: {metadata['category']}")
        print(f"      距离: {distance:.4f}")
        print(f"      相似度分数: {similarity_score:.4f}")

    # ========================================
    # 6. 元数据过滤查询
    # ========================================
    print("\n🎯 步骤 6: 元数据过滤查询")
    print("-" * 60)

    # 只查询"数据库"类别的文档
    filtered_results = collection.query(
        query_embeddings=query_embedding,
        n_results=5,
        where={"category": "数据库"},
        include=["documents", "metadatas", "distances"]
    )

    print(f"✅ 过滤查询完成,类别='数据库'")
    print(f"   找到 {len(filtered_results['ids'][0])} 个结果")

    for i in range(len(filtered_results['ids'][0])):
        doc_id = filtered_results['ids'][0][i]
        document = filtered_results['documents'][0][i]
        metadata = filtered_results['metadatas'][0][i]
        print(f"\n   📄 {doc_id}: {document}:{metadata}")

    # ========================================
    # 7. 获取和更新文档
    # ========================================
    print("\n📖 步骤 7: 获取和更新文档")
    print("-" * 60)

    # 获取单个文档
    doc = collection.get(
        ids=["doc1"],
        include=["documents", "metadatas"]
    )
    print(f"✅ 获取文档 doc1: {doc['documents'][0]}")

    # 更新文档
    collection.update(
        embeddings=list(embeddings[0]),
        ids=["doc1"],
        documents=["Python 是一种优雅的编程语言,易学易用且功能强大V2"],
        metadatas=[{"category": "编程语言", "popularity": 10}]
    )
    print("✅ 已更新文档 doc1")

    # 验证更新
    updated_doc = collection.get(ids=["doc1"], include=["documents"])
    print(f"   更新后的内容: {updated_doc['documents'][0]}")

    # ========================================
    # 8. 删除文档
    # ========================================
    print("\n🗑️  步骤 8: 删除文档")
    print("-" * 60)

    count_before = collection.count()
    collection.delete(ids=["doc5"])
    count_after = collection.count()
    print(f"✅ 已删除文档 doc5")
    print(f"   删除前文档数: {count_before}")
    print(f"   删除后文档数: {count_after}")

    # ========================================
    # 总结
    # ========================================
    print("\n" + "=" * 60)
    print("✨ 演示完成!")
    print("=" * 60)
    print("\n📌 核心功能总结:")
    print("   ✓ 连接到 ChromaDB(持久化存储)")
    print("   ✓ 创建和管理集合")
    print("   ✓ 插入向量数据")
    print("   ✓ 向量相似度查询")
    print("   ✓ 元数据过滤")
    print("   ✓ 获取、更新和删除文档")
    print("\n💾 数据已保存在 ./chroma_db 目录中")
    print("🔄 可以修改代码尝试不同的查询和操作")
    print()


if __name__ == "__main__":
    try:
        main()
    except Exception as e:
        print(f"\n❌ 错误: {e}")
        import traceback

        traceback.print_exc()
        print("\n💡 提示: 请确保已安装 chromadb:")
        print("   pip install chromadb")
  • 日志打印
shell 复制代码
ChromaDB 最小化演示程序
============================================================
📡 步骤 1: 连接到 ChromaDB 服务器
------------------------------------------------------------
✓ 成功连接到 ChromaDB 服务器
📚 步骤 2: 创建集合
------------------------------------------------------------
⚠️  已删除已存在的集合 'demo_knowledge_base'
✅ 成功创建集合: demo_knowledge_base
📝 步骤 3: 准备演示数据
------------------------------------------------------------
✅ 已准备 5 条文档
   1. Python 是一种高级编程语言,易学易用
   2. JavaScript 是 Web 开发的核心语言
   3. ChromaDB 是一个开源的向量数据库
   4. 向量数据库用于存储和检索高维向量
   5. 机器学习模型将文本转换为向量表示
➕ 步骤 4: 插入数据到集合
------------------------------------------------------------
✅ 成功插入 5 条文档到集合
📊 集合中文档总数: 5
🔍 步骤 5: 执行向量查询
------------------------------------------------------------
✅ 查询完成,找到 3 个相似结果
查询结果(按相似度排序):
   📄 结果 #1
      ID: doc1
      内容: Python 是一种高级编程语言,易学易用
      类别: 编程语言
      距离: 0.0075
      相似度分数: 0.9926
   📄 结果 #2
      ID: doc4
      内容: 向量数据库用于存储和检索高维向量
      类别: 数据库
      距离: 0.0075
      相似度分数: 0.9926
   📄 结果 #3
      ID: doc2
      内容: JavaScript 是 Web 开发的核心语言
      类别: 编程语言
      距离: 0.1875
      相似度分数: 0.8421
🎯 步骤 6: 元数据过滤查询
------------------------------------------------------------
✅ 过滤查询完成,类别='数据库'
   找到 2 个结果
   📄 doc4: 向量数据库用于存储和检索高维向量:{'popularity': 7, 'category': '数据库'}
   📄 doc3: ChromaDB 是一个开源的向量数据库:{'popularity': 8, 'category': '数据库'}
📖 步骤 7: 获取和更新文档
------------------------------------------------------------
✅ 获取文档 doc1: Python 是一种高级编程语言,易学易用
✅ 已更新文档 doc1
   更新后的内容: Python 是一种优雅的编程语言,易学易用且功能强大V2
🗑️  步骤 8: 删除文档
------------------------------------------------------------
✅ 已删除文档 doc5
   删除前文档数: 5
   删除后文档数: 4
============================================================
✨ 演示完成!
============================================================
📌 核心功能总结:
   ✓ 连接到 ChromaDB(持久化存储)
   ✓ 创建和管理集合
   ✓ 插入向量数据
   ✓ 向量相似度查询
   ✓ 元数据过滤
   ✓ 获取、更新和删除文档
💾 数据已保存在 ./chroma_db 目录中
🔄 可以修改代码尝试不同的查询和操作

2-先解决模型下载问题

  • 尝试用国内的源来替代HuggingFace快速下载模型
python 复制代码
import os

# 设置模型下载的镜像地址
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'

# 导入 SentenceTransformer
from sentence_transformers import SentenceTransformer

# 下载模型并打印相关信息
model = SentenceTransformer('all-MiniLM-L6-v2')

# 打印分隔线
print(f"✅ 模型已经成功下载")
  • 如果想看详细点,配置logging的日志即可
python 复制代码
import logging
import os

# 设置日志级别为DEBUG,以便打印出详细的下载信息
logging.basicConfig(level=logging.DEBUG)

# 设置模型下载的镜像地址
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'

# 导入 SentenceTransformer
from sentence_transformers import SentenceTransformer

# 下载模型并打印相关信息
model = SentenceTransformer('all-MiniLM-L6-v2')

# 打印分隔线
print(f"✅ 模型已经成功下载")

3-真实embedding向量写入

python 复制代码
#!/usr/bin/env python3
"""
ChromaDB 最小化 Demo
演示 ChromaDB 的核心功能:创建集合、插入数据、向量查询
"""

import os

# 设置模型下载的镜像地址-必须配置(否则模型下载不了)
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'

# 导入 ChromaDB
import chromadb
from sentence_transformers import SentenceTransformer  # 导入 SentenceTransformer


def main():
    print("=" * 60)
    print("ChromaDB 最小化演示程序")
    print("=" * 60)

    # ========================================
    # 1. 连接到 ChromaDB 服务器
    # ========================================
    print("\n📡 步骤 1: 连接到 ChromaDB 服务器")
    print("-" * 60)

    # 方法1:使用默认配置连接(内存模式)
    # client = chromadb.Client()
    # print("✓ ChromaDB 内存模式连接成功")

    # 方法2:使用持久化存储(持久化模式)
    # client = chromadb.PersistentClient(path="./chroma_db")
    # print("✅ 已连接到 ChromaDB (使用持久化存储)")

    # 方法3:使用服务器配置连接(服务器模式)
    client = chromadb.HttpClient(host='localhost', port=8000)
    print("✓ 成功连接到 ChromaDB 服务器")

    # ========================================
    # 2. 创建集合(Collection)
    # ========================================
    print("\n📚 步骤 2: 创建集合")
    print("-" * 60)

    collection_name = "demo_knowledge_base"

    # 检查并删除已存在的集合
    try:
        client.delete_collection(name=collection_name)
        print(f"⚠️  已删除已存在的集合 '{collection_name}'")
    except:
        pass

    # 创建新集合
    collection = client.create_collection(
        name=collection_name,
        metadata={"description": "演示知识库"}
    )
    print(f"✅ 成功创建集合: {collection_name}")

    # ========================================
    # 3. 准备演示数据
    # ========================================
    print("\n📝 步骤 3: 准备演示数据")
    print("-" * 60)

    # 模拟的文档数据
    documents = [
        "Python 是一种高级编程语言,易学易用",
        "JavaScript 是 Web 开发的核心语言",
        "ChromaDB 是一个开源的向量数据库",
        "向量数据库用于存储和检索高维向量",
        "机器学习模型将文本转换为向量表示"
    ]

    # 使用 all-MiniLM-L6-v2 模型生成 embeddings
    model = SentenceTransformer('all-MiniLM-L6-v2')  # 加载模型
    embeddings = model.encode(documents)  # 生成 embeddings

    # 元数据
    metadatas = [
        {"category": "编程语言", "popularity": 10},
        {"category": "编程语言", "popularity": 9},
        {"category": "数据库", "popularity": 8},
        {"category": "数据库", "popularity": 7},
        {"category": "人工智能", "popularity": 9},
    ]

    # 文档 ID
    ids = ["doc1", "doc2", "doc3", "doc4", "doc5"]

    print(f"✅ 已准备 {len(documents)} 条文档")
    for i, doc in enumerate(documents, 1):
        print(f"   {i}. {doc}")

    # ========================================
    # 4. 插入数据到集合
    # ========================================
    print("\n➕ 步骤 4: 插入数据到集合")
    print("-" * 60)

    collection.add(
        documents=documents,
        embeddings=embeddings,
        metadatas=metadatas,
        ids=ids
    )
    print(f"✅ 成功插入 {len(documents)} 条文档到集合")

    # 显示集合统计信息
    count = collection.count()
    print(f"📊 集合中文档总数: {count}")

    # ========================================
    # 5. 向量查询
    # ========================================
    print("\n🔍 步骤 5: 执行向量查询")
    print("-" * 60)

    # 查询向量(模拟查询"编程语言相关的内容")
    query_embedding = model.encode(["编程语言"])  # 使用模型生成查询向量

    # 执行查询
    results = collection.query(
        query_embeddings=query_embedding,
        n_results=3,  # 返回最相似的前 3 个结果
        include=["documents", "metadatas", "distances"]
    )

    print(f"✅ 查询完成,找到 {len(results['ids'][0])} 个相似结果")
    print("\n查询结果(按相似度排序):")

    for i in range(len(results['ids'][0])):
        doc_id = results['ids'][0][i]
        document = results['documents'][0][i]
        distance = results['distances'][0][i]
        metadata = results['metadatas'][0][i]

        # ChromaDB 使用 L2 距离,距离越小越相似
        similarity_score = 1 / (1 + distance)

        print(f"\n   📄 结果 #{i + 1}")
        print(f"      ID: {doc_id}")
        print(f"      内容: {document}")
        print(f"      类别: {metadata['category']}")
        print(f"      距离: {distance:.4f}")
        print(f"      相似度分数: {similarity_score:.4f}")

    # ========================================
    # 6. 元数据过滤查询
    # ========================================
    print("\n🎯 步骤 6: 元数据过滤查询")
    print("-" * 60)

    # 只查询"数据库"类别的文档
    filtered_results = collection.query(
        query_embeddings=query_embedding,
        n_results=5,
        where={"category": "数据库"},
        include=["documents", "metadatas", "distances"]
    )

    print(f"✅ 过滤查询完成,类别='数据库'")
    print(f"   找到 {len(filtered_results['ids'][0])} 个结果")

    for i in range(len(filtered_results['ids'][0])):
        doc_id = filtered_results['ids'][0][i]
        document = filtered_results['documents'][0][i]
        metadata = filtered_results['metadatas'][0][i]
        print(f"\n   📄 {doc_id}: {document}:{metadata}")

    # ========================================
    # 7. 获取和更新文档
    # ========================================
    print("\n📖 步骤 7: 获取和更新文档")
    print("-" * 60)

    # 获取单个文档
    doc = collection.get(
        ids=["doc1"],
        include=["documents", "metadatas"]
    )
    print(f"✅ 获取文档 doc1: {doc['documents'][0]}")

    # 更新文档
    collection.update(
        ids=["doc1"],
        documents=["Python 是一种优雅的编程语言,易学易用且功能强大"],
        metadatas=[{"category": "编程语言", "popularity": 10}]
    )
    print("✅ 已更新文档 doc1")

    # 验证更新
    updated_doc = collection.get(ids=["doc1"], include=["documents"])
    print(f"   更新后的内容: {updated_doc['documents'][0]}")

    # ========================================
    # 8. 删除文档
    # ========================================
    print("\n🗑️  步骤 8: 删除文档")
    print("-" * 60)

    count_before = collection.count()
    collection.delete(ids=["doc5"])
    count_after = collection.count()
    print(f"✅ 已删除文档 doc5")
    print(f"   删除前文档数: {count_before}")
    print(f"   删除后文档数: {count_after}")

    # ========================================
    # 总结
    # ========================================
    print("\n" + "=" * 60)
    print("✨ 演示完成!")
    print("=" * 60)
    print("\n📌 核心功能总结:")
    print("   ✓ 连接到 ChromaDB(持久化存储)")
    print("   ✓ 创建和管理集合")
    print("   ✓ 插入向量数据")
    print("   ✓ 向量相似度查询")
    print("   ✓ 元数据过滤")
    print("   ✓ 获取、更新和删除文档")
    print("\n💾 数据已保存在 ./chroma_db 目录中")
    print("🔄 可以修改代码尝试不同的查询和操作")
    print()


if __name__ == "__main__":
    try:
        main()
    except Exception as e:
        print(f"\n❌ 错误: {e}")
        import traceback

        traceback.print_exc()
        print("\n💡 提示: 请确保已安装 chromadb 和 sentence-transformers:")
        print("   pip install chromadb sentence-transformers")
相关推荐
摇滚侠15 小时前
MySQL 中 utf8mb4 字符集,字母a占几个字节,一个汉字占几个字节 / MySQL 中 utf8mb3 字符集,字母a占几个字节,一个汉字占几个字节
数据库·mysql
ChineHe15 小时前
Redis数据类型篇001_数据类型梳理与选择指南
数据库·redis·缓存
Antoine-zxt15 小时前
MySQL CPU飙升至500%的深度排查与优化实践
数据库·mysql
Awkwardx15 小时前
MySQL数据库—MySQL基本查询
数据库·mysql
夜流冰15 小时前
Excel - MS Support for Excel: 2 Collaborate
数据库·windows·excel
轻微的风格艾丝凡15 小时前
嵌入式定时器计时技巧:用有符号数省略溢出判断的底层逻辑与实践
数据库·算法·dsp开发·嵌入式软件
Lonely丶墨轩16 小时前
从登录入口窥见架构:一个企业级双Token认证系统的深度拆解
java·数据库·sql
收获不止数据库16 小时前
黄仁勋2026CES演讲复盘:旧世界,裂开了!
大数据·数据库·人工智能·职场和发展
汽车仪器仪表相关领域16 小时前
工况模拟精准检测,合规减排赋能行业 ——NHASM-1 型稳态工况法汽车排气检测系统项目实战经验分享
数据库·算法·单元测试·汽车·压力测试·可用性测试