chromadb 这个query_texts 查询的是基于分词 还是基于向量查询的
python
def query_rag(question):
result = collection.query(
query_texts="突然没有网了怎么办",
n_results=1
)
return result['documents'][0]
里是基于向量查询,不是基于分词/关键词匹配。
python
result = collection.query(
query_texts="突然没有网了怎么办",
n_results=1
)
ChromaDB 会按这个流程处理:
- 把
"突然没有网了怎么办"交给 collection 配置的 embedding_function; - 生成一个查询向量;
- 拿这个向量和库里已存储的文档向量做相似度检索;
- 返回距离最近、语义最接近的文档。
不是看你这句话里有没有"网""断网"这些词,是看语义是否接近。所以即使库里存的是"网络连接中断如何处理",也可能被检索出来。
几个注意点
query_texts官方写法建议传列表:
python
query_texts=["突然没有网了怎么办"]
- 如果你创建 collection 时没有指定
embedding_function,ChromaDB 默认会用内置的all-MiniLM-L6-v2做向量化。 - 如果创建时指定了自己的 Embedding 模型,查询时也会自动用同一个模型。
- 如果你想更明确地控制,也可以自己先生成向量,然后用:
python
collection.query(query_embeddings=[query_vector], n_results=1)
和分词/关键词查询的区别
| 方式 | 依据 | 适合场景 |
|---|---|---|
query_texts 向量查询 |
语义相似度 | RAG、问答、模糊匹配 |
| 关键词/分词查询 | 词匹配 | 精确找 SKU、编号、专有名词 |
| 混合检索 | 向量 + 关键词 | 既要语义又要精确词匹配 |
如果你发现检索结果不准,通常不是分词问题,而是:embedding 模型不够合适、文本切块太大、或者查询语句和库中文档语义差异太大。