Android开发转AI Agent:第11天——Chroma向量数据库,3行替代手写10行检索
·
作者:一位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的完整学习过程,欢迎关注交流。
更多推荐

所有评论(0)