一、RAG核心

1、传统 VS 大模型

     智能客服系统下面是两则设计的原理:

2、向量与Embeddings嵌入向量

2.1. 向量(Vector)

 由一组有序数字排成的一维数组,用来表示一个对象在某个空间中的位置或特征。

  • 形式:[x₁, x₂, x₃, ..., xₙ]
  • 维度:数字的个数 n 就是向量的维度
  • 作用:用来量化事物,让计算机能计算、比较、处理

例子:

  • 二维向量:[2, 3]
  • 三维向量:[0.1, 0.5, 0.9]

2.2. Embeddings(嵌入向量)

文字、图片、声音、用户行为非结构化信息,通过模型(如 Word2Vec、BERT、Transformer)转化成的低维稠密向量

核心特点:

  • 语义相近 → 向量距离近
  • 语义无关 → 向量距离远
  • 可用于:搜索、推荐、分类、聚类、相似度计算

简单理解:

Embeddings = 把现实世界的东西翻译成计算机能懂的 “语义向量”

举个最经典的例子(词向量)

假设模型训练后得到:

  • 国王:[0.9, 0.1, 0.3, ...]
  • 王后:[0.88, 0.12, 0.31, ...]
  • 苹果:[0.05, 0.8, 0.02, ...]

你会发现:

  • 国王 ↔ 王后:向量很接近
  • 国王 ↔ 苹果:向量离得很远

2.3、两者关系

  • 向量:是数学基础,是通用工具。
  • Embedding:是带有语义信息的特殊向量,专门给 AI 用。

2.4、典型应用

  • 搜索:把问题转 embedding,找最相似的文档
  • 推荐:把用户、商品转 embedding,匹配相似兴趣
  • 聊天 AI:把你的话转 embedding,理解你想表达什么
  • 人脸识别:把人脸转 embedding,比对相似度

3、向量间的相似度计算

核心就是:用数学方法衡量两个向量像不像,在 Embedding 里就等于衡量语义 / 特征近不近

1. 欧式距离(Euclidean Distance)

定义:空间中两点的直线距离。

公式:

  • 距离 越小 → 越相似
  • 距离 越大 → 越不相似

适用:坐标类、位置类、低维特征。

2. 余弦相似度(Cosine Similarity)

最常用在 Embedding、文本、推荐里

定义:两个向量夹角的余弦值,只关心方向,不关心长度。

公式:

  • 结果范围:[-1, 1]
  • 越接近 1 → 方向越一致 → 越相似
  • 接近 0 → 不相关
  • 接近 -1 → 相反

适用:文本 Embedding、语义相似度、推荐、搜索(几乎所有 NLP 场景)。

3. 点积(Dot Product)

   公式:

  • 越大 越相似
  • 但受向量长度影响,一般不如余弦相似度稳定

 欧式距离与余弦距离图

案例1:文本向量化(Embedding)模型

from openai import OpenAI
from dotenv import load_dotenv
import os

# 默认加载项目根目录下的 .env 文件
load_dotenv()

# 会自动读取环境变量
client=OpenAI()

# 生成文本的嵌入
def get_embeddings(texts,model="text-embedding-v4"):
    data=client.embeddings.create(input=texts,model=model).data
    print(data)
    return [x.embedding for x in data]

test_query=['大模型']
vec=get_embeddings(test_query)
print(vec)
print(vec[0])
print(len(vec[0]))

案例2:「聊天、回答问题、写内容、思考推理」的超强大模型

from openai import OpenAI
from dotenv import load_dotenv
# 默认加载项目根目录下的 .env 文件
load_dotenv()
# 会自动读取环境变量
# 1. 获取client对象,OpenAI类对象
client = OpenAI()
# 若直接通过 ‌阿里云百炼平台‌ 调用 Qwen3-Max 的标准 API(非免费版)
#阿里云Qwen3-Max是通义千问系列的旗舰级推理大模型
# 2. 调用模型
response = client.chat.completions.create(
    model="qwen3-max",
    messages=[
        {"role":"system","content":"你是AI助理,回答很简洁"},
        {"role":"user","content":"小明有2条宠物狗"},
        {"role":"assistant","content":"好的"},
        {"role":"user","content":"小红有3只宠物猫"},
        {"role":"assistant","content":"好的"},
        {"role":"user","content":"总共有几个宠物"}
    ],
    stream=True    # 开启了流式输出的功能
)
# 3. 处理结果
for chunk in response:
    print(chunk.choices[0].delta.content,end=' ',flush=True)     # end=' '每一段之间以空格分隔, # flush=True立刻刷新缓冲区

说明:

      调用模型传入的参数messages,是list对象,即表明其支持非常多的消息在内。

      我们可以将历史消息填入,让模型知晓对话的上下文,更好的回答。

      当前的历史消息是一次性的,如果是生产系统可以将消息保存到文件、数据库等持久化工具内,需要的时候提取使用 后续学习LangChain库,会学习短期记忆和长期记忆的使用方法。

案例3:文本向量化(Embedding)模型-(余弦距离和欧式距离)

from openai import OpenAI
from dotenv import load_dotenv
import numpy as np
#该函数用于计算两个数组的点积(内积)。
from numpy import dot
#该函数用于计算向量的范数(模),默认为2范数(欧几里得范数)。
from numpy.linalg import norm
import os

# 默认加载项目根目录下的 .env 文件
load_dotenv()

# 会自动读取环境变量
client = OpenAI()

def cos_sim(vec1, vec2):
    '''余弦距离,越大越相似'''
    return dot(vec1, vec2) / (norm(vec1)*norm(vec2))

def os_line(vec1,vec2):
    '''欧式距离,越小越相似'''
    x=np.asarray(vec1)-np.asarray(vec2)
    return norm(x)

def get_embeddings(texts,model='text-embedding-v4'):
    '''获取文本的向量表示'''
    data=client.embeddings.create(input=texts,model=model).data
    #返回一个包含所以嵌入表示的列表
    return [d.embedding for d in data]

query = "科技前沿"
documents = [
    "OpenAI 发布 GPT-5 模型,推理与代码能力实现重大突破",
    "中国自研量子计算机“九章三号”刷新光量子计算世界纪录",
    "俄乌冲突持续,欧盟宣布新一轮对俄能源制裁",
    "华为发布全新鸿蒙OS 5.0,实现全场景设备无缝互联",
    "联合国安理会上,俄罗斯与美国,伊朗与以色列“吵”起来了"
]
# 获取查询向量
query_vec = get_embeddings([query])[0];
# 获取文档向量
doc_vecs = get_embeddings(documents);

print("余弦距离:")
print(cos_sim(query_vec,query_vec))
for ve in doc_vecs:
    print(cos_sim(query_vec,ve))

print("\n 欧式距离:")
print(os_line(query_vec,query_vec))
for ve in doc_vecs:
    print(os_line(query_vec,ve))

Logo

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

更多推荐