作者:一位Android开发工程师 | 2026年6月29日
系列:第10天手写了完整RAG,今天用专业工具替代手写部分


前言

第9/10天我手写了向量检索——for 循环 + 余弦相似度 + 排序。这在知识库只有 5 条文档时没问题,但如果知识库有 5000 条,手写循环就太慢了。

今天学 Chroma——一个专门做向量存储和检索的数据库。


对比:手写 vs Chroma

手写版(第10天,8行)

q_vec = model.encode(question)
results = []
for doc in docs:
    vec = model.encode(doc)
    sim = np.dot(vec, q_vec) / (norm(vec) * norm(q_vec))
    results.append((sim, doc))
results.sort(reverse=True)
top3 = [doc for _, doc in results[:3]]

Chroma 版(3行)

collection = client.create_collection(name="my_docs")
collection.add(documents=docs, ids=ids)
results = collection.query(query_texts=[question], n_results=3)

Chroma 替你做了三件事:向量化 + 存储 + 检索


完整代码

import chromadb
from sentence_transformers import SentenceTransformer

# 自定义 Embedding 函数(用本地中文模型)
class LocalEmbedding(EmbeddingFunction):
    def __init__(self):
        self.model = SentenceTransformer("shibing624/text2vec-base-chinese")
    def __call__(self, input):
        return self.model.encode(input).tolist()

# Chroma 核心 4 行
client = chromadb.Client()
collection = client.create_collection(name="my_docs", embedding_function=LocalEmbedding())
collection.add(documents=docs, ids=[f"doc_{i}" for i in range(len(docs))])
results = collection.query(query_texts=["协程怎么管理生命周期?"], n_results=3)

踩坑:中文模型选择

一开始用 all-MiniLM-L6-v2,结果"协程怎么管理生命周期"检索到的第一条是 Room 数据库相关——不是生命周期那条。

原因:all-MiniLM-L6-v2 对中文语义理解不够精确。换成专为中文优化的 shibing624/text2vec-base-chinese 后,检索准确了——生命周期那条排到了第一。

教训:做中文 RAG 一定要用中文 Embedding 模型。


Chroma 核心 4 行(需要记住的)

client = chromadb.Client()                            # 1. 创建客户端
collection = client.create_collection(name="xxx")      # 2. 建集合(类似 CREATE TABLE)
collection.add(documents=docs, ids=ids)                # 3. 添加文档
results = collection.query(query_texts=[q], n_results=3)  # 4. 查询

今天的一句话总结

Chroma 就是把第9天手写的 for 循环+余弦相似度+排序封装成了 collection.query() 一行。就像用 Room 数据库替代手写 SQLite——专业工具让代码更简洁。


下一篇预告

第12天:Function Calling——让 LLM 不再只是"说",而是能"做"。Agent 最关键的能力。


本系列记录一位Android开发者转行AI Agent的完整学习过程,欢迎关注交流。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐