🔍 一、如何查看向量数据库内容(核心代码)

1
2
3
4
5
6
7
8
data = vector_store._collection.get(
include=["documents", "metadatas", "embeddings"]
)

print("ids:", data["ids"])
print("documents:", data["documents"])
print("metadatas:", data["metadatas"])
print("数量:", len(data["documents"]))

🧠 说明

  • ids 👉 每条数据的唯一标识(默认自动生成)
  • documents 👉 原始文本
  • metadatas 👉 你自己传的附加信息
  • embeddings 👉 向量(默认不会返回,需要 include)

🔎 查看 embedding(调试神器)

1
2
for i, emb in enumerate(data["embeddings"]):
print(f"doc{i} 前5维:", emb[:5])

👉 用来判断:

  • 是否全一样 ❌
  • 是否正常分布 ✅

🚨 二、常见 Bug:检索结果重复(你刚踩的这个)

❗现象

1
2
3
TopK=4
返回结果:
同一条文本 × 4

💥 根本原因

1
2
不是检索器问题 ❌
而是数据库里有大量重复数据 ✅

🧪 如何判断?

1
2
print("数量:", len(data["documents"]))
print("唯一文本数:", len(set(data["documents"])))

👀 如果看到:

1
2
数量: 72
唯一文本数: 4

👉 💥 说明你重复写入了很多次!


🧠 三、为什么会重复?

因为:

1
Chroma.from_texts(...)

👉 默认使用同一个 collection(通常叫 "langchain"

所以:

1
2
3
4
每运行一次代码
→ 就往同一个数据库追加数据
→ 数据越来越多
→ 检索命中多个“重复副本”

🚑 四、解决方案(必须记住!!!)

✅ 方案1:每次运行前清空数据库(推荐)

1
vector_store._client.delete_collection("langchain")

✅ 方案2:指定新的 collection_name

1
2
3
4
5
vector_store = Chroma.from_texts(
texts=[doc['text'] for doc in documents],
embedding=embeddings,
collection_name="my_test_db"
)

👉 避免污染旧数据


✅ 方案3:开发时使用“真内存模式”(最干净)

1
2
3
4
5
6
7
from chromadb.config import Settings

vector_store = Chroma.from_texts(
texts=[doc['text'] for doc in documents],
embedding=embeddings,
client_settings=Settings(persist_directory=None)
)

👉 进程结束自动清空


✅ 方案4:手动清空数据(不删表)

1
vector_store._collection.delete(where={})

💡 五、RAG 调试四步法(强烈建议收藏)

1
2
3
4
1️⃣ embedding 正常吗?
2️⃣ 数据库里有多少条?
3️⃣ 有没有重复数据?
4️⃣ 检索结果是否合理?

🎯 六、一句话总结(记住这个就够了)

👉 “检索重复 ≠ 检索错,往往是数据库里有重复数据”


🫶 小贴士(给未来的你)

以后每次写完向量库,先跑一句:

1
print("当前数据量:", vector_store._collection.count())

👉 一秒避免这类坑


由GPT老师记录