当前位置: 首页 > news >正文

大模型RAG (二)

一、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))

http://www.cnnetsun.cn/news/2037287.html

相关文章:

  • 告别Excel配置表:在Unity中搭建Luban+Jenkins的自动化配置管线
  • UE5Varest发送https请求发不出去,收不到任何回复
  • 避开这些坑!STM32G474读写FLASH时,关于保护、对齐和中断的避坑指南
  • 【音视频 | ALSA】从内核到应用:深入解析ALSA框架的层次结构与核心组件
  • 从 OpenSwiftUI 到 DanceUI:换个方式 Dive SwiftUI -- 肘子的 Swift 周报 #132
  • SQL如何优化子查询的性能_改写为JOIN关联查询与消除嵌套
  • Anthropic MCP 设计漏洞可导致 RCE,威胁 AI 供应链安全
  • UVM验证中的‘幽灵任务’:如何优雅处理objection未结束导致的PH_TIMEOUT
  • 反向代理与内网穿透实战
  • 微服务架构设计核心原则解析
  • CentOS7.9磁盘管理全栈【20260420】001篇
  • 从数据手册到实际代码:一步步拆解SGP30的IIC通信协议与STM32驱动逻辑
  • Python动态特性与Monkey Patching实战解析
  • GME-Qwen2-VL-2B-Instruct惊艳效果:0.12低匹配文本自动过滤+0.48高匹配标红展示
  • 前端架构设计
  • 05(开源)加工工艺匹配:顶级车床切削参数·刀具适配·工况适配 保姆级开源参数【国产机床登顶系列第五篇】
  • 打卡信奥刷题(3149)用C++实现信奥题 P7677 [COCI 2013/2014 #5] LADICE
  • STC89C52单片机玩转NE555:手把手教你实现一个简易频率计(附完整工程)
  • Qwen3.5-9B-GGUF本地AI办公套件:邮件撰写、会议纪要、PPT大纲一体化
  • CardEditor:3MB轻量级桌游卡牌批量生成器,让设计效率提升300%
  • 如何用macOS自动点击器实现高效自动化操作:完整指南
  • 速看!黄金秘籍解决华为防火墙最困难的故障
  • 电商反爬这道墙,Web Unlocker 是怎么翻过去的?
  • 别再乱喂狗了!AutoSar WdgM三种监控机制(Alive/Deadline/Logical)实战配置避坑指南
  • 国家中小学智慧教育平台电子课本解析工具:3分钟极速获取教学资源的终极指南
  • 深度强化学习实战:从零构建游戏AI的Q学习指南
  • 新手必看:CTFHub靶场RCE通关保姆级教程(从环境搭建到Flag获取)
  • 从三相到两相:手把手推导感应电机的Clarke与Park变换(附MATLAB验证代码)
  • 计算机毕业设计:Python股票市场智能分析与LSTM预测系统 Flask框架 TensorFlow LSTM 数据分析 可视化 大数据 大模型(建议收藏)✅
  • 从一次订单失败回滚看Seata AT模式:一个真实微服务事务的完整生命周期