作者一位Android开发工程师 | 2026年6月29日系列第10天手写了完整RAG今天用专业工具替代手写部分前言第9/10天我手写了向量检索——for 循环 余弦相似度 排序。这在知识库只有 5 条文档时没问题但如果知识库有 5000 条手写循环就太慢了。今天学 Chroma——一个专门做向量存储和检索的数据库。对比手写 vs Chroma手写版第10天8行q_vecmodel.encode(question)results[]fordocindocs:vecmodel.encode(doc)simnp.dot(vec,q_vec)/(norm(vec)*norm(q_vec))results.append((sim,doc))results.sort(reverseTrue)top3[docfor_,docinresults[:3]]Chroma 版3行collectionclient.create_collection(namemy_docs)collection.add(documentsdocs,idsids)resultscollection.query(query_texts[question],n_results3)Chroma 替你做了三件事向量化 存储 检索。完整代码importchromadbfromsentence_transformersimportSentenceTransformer# 自定义 Embedding 函数用本地中文模型classLocalEmbedding(EmbeddingFunction):def__init__(self):self.modelSentenceTransformer(shibing624/text2vec-base-chinese)def__call__(self,input):returnself.model.encode(input).tolist()# Chroma 核心 4 行clientchromadb.Client()collectionclient.create_collection(namemy_docs,embedding_functionLocalEmbedding())collection.add(documentsdocs,ids[fdoc_{i}foriinrange(len(docs))])resultscollection.query(query_texts[协程怎么管理生命周期],n_results3)踩坑中文模型选择一开始用all-MiniLM-L6-v2结果协程怎么管理生命周期检索到的第一条是 Room 数据库相关——不是生命周期那条。原因all-MiniLM-L6-v2对中文语义理解不够精确。换成专为中文优化的shibing624/text2vec-base-chinese后检索准确了——生命周期那条排到了第一。教训做中文 RAG 一定要用中文 Embedding 模型。Chroma 核心 4 行需要记住的clientchromadb.Client()# 1. 创建客户端collectionclient.create_collection(namexxx)# 2. 建集合类似 CREATE TABLEcollection.add(documentsdocs,idsids)# 3. 添加文档resultscollection.query(query_texts[q],n_results3)# 4. 查询今天的一句话总结Chroma 就是把第9天手写的 for 循环余弦相似度排序封装成了collection.query()一行。就像用 Room 数据库替代手写 SQLite——专业工具让代码更简洁。下一篇预告第12天Function Calling——让 LLM 不再只是说而是能做。Agent 最关键的能力。本系列记录一位Android开发者转行AI Agent的完整学习过程欢迎关注交流。
Android开发转AI Agent:第11天——Chroma向量数据库,3行替代手写10行检索
发布时间:2026/6/30 12:50:19
作者一位Android开发工程师 | 2026年6月29日系列第10天手写了完整RAG今天用专业工具替代手写部分前言第9/10天我手写了向量检索——for 循环 余弦相似度 排序。这在知识库只有 5 条文档时没问题但如果知识库有 5000 条手写循环就太慢了。今天学 Chroma——一个专门做向量存储和检索的数据库。对比手写 vs Chroma手写版第10天8行q_vecmodel.encode(question)results[]fordocindocs:vecmodel.encode(doc)simnp.dot(vec,q_vec)/(norm(vec)*norm(q_vec))results.append((sim,doc))results.sort(reverseTrue)top3[docfor_,docinresults[:3]]Chroma 版3行collectionclient.create_collection(namemy_docs)collection.add(documentsdocs,idsids)resultscollection.query(query_texts[question],n_results3)Chroma 替你做了三件事向量化 存储 检索。完整代码importchromadbfromsentence_transformersimportSentenceTransformer# 自定义 Embedding 函数用本地中文模型classLocalEmbedding(EmbeddingFunction):def__init__(self):self.modelSentenceTransformer(shibing624/text2vec-base-chinese)def__call__(self,input):returnself.model.encode(input).tolist()# Chroma 核心 4 行clientchromadb.Client()collectionclient.create_collection(namemy_docs,embedding_functionLocalEmbedding())collection.add(documentsdocs,ids[fdoc_{i}foriinrange(len(docs))])resultscollection.query(query_texts[协程怎么管理生命周期],n_results3)踩坑中文模型选择一开始用all-MiniLM-L6-v2结果协程怎么管理生命周期检索到的第一条是 Room 数据库相关——不是生命周期那条。原因all-MiniLM-L6-v2对中文语义理解不够精确。换成专为中文优化的shibing624/text2vec-base-chinese后检索准确了——生命周期那条排到了第一。教训做中文 RAG 一定要用中文 Embedding 模型。Chroma 核心 4 行需要记住的clientchromadb.Client()# 1. 创建客户端collectionclient.create_collection(namexxx)# 2. 建集合类似 CREATE TABLEcollection.add(documentsdocs,idsids)# 3. 添加文档resultscollection.query(query_texts[q],n_results3)# 4. 查询今天的一句话总结Chroma 就是把第9天手写的 for 循环余弦相似度排序封装成了collection.query()一行。就像用 Room 数据库替代手写 SQLite——专业工具让代码更简洁。下一篇预告第12天Function Calling——让 LLM 不再只是说而是能做。Agent 最关键的能力。本系列记录一位Android开发者转行AI Agent的完整学习过程欢迎关注交流。