作者:一位Android开发工程师 | 2026年6月10日
系列:第二阶段开始,进入RAG(检索增强生成)核心


前言

前7天我一直在调 LLM API,但有一个根本限制——LLM 只能回答训练数据里有的东西。你问它"公司内部 API 文档怎么写",它不知道。

RAG(检索增强生成)解决这个问题:先把相关资料检索出来,再和问题一起发给 LLM。而 RAG 的第一步,就是今天要学的 Embedding——把文字变成数字向量。


Embedding 是什么

一句话:把"文字"翻译成"坐标",让语义相近的句子在数学空间里挨得近。

类比 Kotlin:就像给每部电影打分(剧情/画面/演技),然后两部评分相近的电影就是"相似"的。

"Android开发" → [0.12, -0.34, 0.78, ..., 0.45]  (384个数字)
"移动端编程" → [0.15, -0.31, 0.72, ..., 0.41]  (384个数字,非常接近!)
"今天下雨"   → [-0.82, 0.61, -0.23, ..., 0.03] (差很远)

实验代码

from sentence_transformers import SentenceTransformer
import numpy as np

model = SentenceTransformer("all-MiniLM-L6-v2")

vec_a = model.encode("Android 应用开发")
vec_b = model.encode("移动端 App 编程")
vec_c = model.encode("今天天气很好适合出去跑步")

# 余弦相似度:两个向量越接近,值越接近 1
def cosine(a, b):
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

print(f"Android vs 移动端: {cosine(vec_a, vec_b):.4f}")  # 预期 > 0.7
print(f"Android vs 天气:   {cosine(vec_a, vec_c):.4f}")  # 预期 < 0.5
print(f"移动端 vs 天气:   {cosine(vec_b, vec_c):.4f}")  # 预期 < 0.5

运行结果

Android vs 移动端: 0.7894  ← 高!意思相近
Android vs 天气:   0.4317  ← 低!不相关
移动端 vs 天气:   0.4487  ← 低!不相关

结果完美:语义相近的得分高,不相关的得分低。


关于模型选择

我用的是 all-MiniLM-L6-v2(80MB,轻量级,支持中英文)。但后面第11天发现它对中文检索精度不够,换成了 shibing624/text2vec-base-chinese(专为中文优化)。

国内下载 HuggingFace 模型需要镜像:

import os
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"

今天的一句话总结

Embedding 把"不可计算的语义"变成"可计算的数字"——两段文字的语义相似度,变成了两个向量的余弦距离。这是 RAG 检索的数学基础。


下一篇预告

第9天:向量检索——把多段文档向量化存储,查询时找到最相关的。


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

Logo

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

更多推荐