作者:一位Android开发工程师 | 2026年6月14日
系列:第9天手写了检索,今天把检索+LLM生成串成完整RAG


前言

前两天分别学了 Embedding(文字→向量)和向量检索(找相关文档)。今天把它们和 LLM API 串起来,完成一个完整的 RAG 流程:

用户问题 → 向量检索 → 找到相关文档 → 拼接prompt → LLM生成回答

核心代码

# 步骤1:检索(第9天学的)
q_vec = model.encode(question)
results = []
for doc in docs:
    vec = model.encode(doc)
    sim = 余弦相似度(vec, q_vec)
    results.append((sim, doc))
results.sort(reverse=True)
top3 = [doc for _, doc in results[:3]]

# 步骤2:拼接 prompt
context = " ".join(top3)
prompt = f"""根据以下参考资料回答用户问题。如果资料中没有相关信息,请说"参考资料中未找到"。

参考资料:
{context}

用户问题:
{question}"""

# 步骤3:LLM 生成(第1天学的)
response = client.chat.completions.create(
    model="turing/gpt-4o-mini",
    messages=[{"role": "user", "content": prompt}],
    temperature=0.3,
)
print(response.choices[0].message.content)

两个测试问题

问题1:知识库有的

问:协程怎么在Android中管理生命周期?

LLM 从知识库找到了 viewModelScopelifecycleScope 的资料,给出准确回答。

问题2:知识库没有的

问:Retrofit怎么配置拦截器?

LLM 诚实回答:“参考资料中未找到相关信息”——因为知识库里全是协程相关的文档,没有 Retrofit。

这正是 RAG 的核心价值:诚实地说"不知道",而不是瞎编。


今天的一句话总结

RAG = 检索 + 生成。先搜资料再回答,既让 LLM 能回答知识库外的问题,又避免了幻觉(瞎编)。这 3 步(检索→拼接→生成)是后面所有知识库 Agent 的基础。


下一篇预告

第11天:Chroma 向量数据库——用专业工具替代手写的 for 循环检索。


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

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐