作者一位Android开发工程师 | 2026年6月14日系列第9天手写了检索今天把检索LLM生成串成完整RAG前言前两天分别学了 Embedding文字→向量和向量检索找相关文档。今天把它们和 LLM API 串起来完成一个完整的 RAG 流程用户问题 → 向量检索 → 找到相关文档 → 拼接prompt → LLM生成回答核心代码# 步骤1检索第9天学的q_vecmodel.encode(question)results[]fordocindocs:vecmodel.encode(doc)sim余弦相似度(vec,q_vec)results.append((sim,doc))results.sort(reverseTrue)top3[docfor_,docinresults[:3]]# 步骤2拼接 promptcontext .join(top3)promptf根据以下参考资料回答用户问题。如果资料中没有相关信息请说参考资料中未找到。 参考资料{context}用户问题{question}# 步骤3LLM 生成第1天学的responseclient.chat.completions.create(modelturing/gpt-4o-mini,messages[{role:user,content:prompt}],temperature0.3,)print(response.choices[0].message.content)两个测试问题问题1知识库有的问协程怎么在Android中管理生命周期LLM 从知识库找到了viewModelScope和lifecycleScope的资料给出准确回答。问题2知识库没有的问Retrofit怎么配置拦截器LLM 诚实回答“参考资料中未找到相关信息”——因为知识库里全是协程相关的文档没有 Retrofit。这正是 RAG 的核心价值诚实地说不知道而不是瞎编。今天的一句话总结RAG 检索 生成。先搜资料再回答既让 LLM 能回答知识库外的问题又避免了幻觉瞎编。这 3 步检索→拼接→生成是后面所有知识库 Agent 的基础。下一篇预告第11天Chroma 向量数据库——用专业工具替代手写的 for 循环检索。本系列记录一位Android开发者转行AI Agent的完整学习过程欢迎关注交流。