Retrieval-Augmented Generation

news/2025/2/15 13:52:35/文章来源:https://www.cnblogs.com/super-zzh/p/18716816

大模型的商业化落地挑战

更好地控制大模型生成:

  • 生成
    • 优点:内容的多样性、创造性
    • 缺点:存在不可控制的问题
  • 检索
    • 优点:可控
    • 缺点:内容具有局限性

结合两者:检索增强生成(Retrieval-Augmented Generation, RAG)

案例:金融智能客服系统的几种思路

  1. 专家系统
  2. 生成式模型
  3. 大模型检索增强

img

基于文档的LLM回复系统搭建思路

img

目前,RAG不能完全解决hallucination(幻觉,一个很fancy但是逼气很重的名词)问题:

  • 检索准确率受限
  • LLM理解能力有限
  • 问题的复杂度
  • 错位在以上步骤中累积

文档分割

  • 根据句子来切分
  • 按照字符数来切分
  • 按固定字符数,但结合overlapping window
  • 递归方法:RecursiveCharacterTextSplitter
  • 根据语义来分割

英文情形

Split by Sentence

import nltk
from nltk.tokenize import sent_tokenizetext = ("The Earth's atmosphere is composed of layers, including the troposphere, ""stratosphere, mesosphere, thermosphere, and exosphere. The troposphere is ""the lowest layer where all weather takes place and contains 75% of the atmosphere's mass. ""Above this, the stratosphere contains the ozone layer, which protects the Earth ""from harmful ultraviolet radiation.")# Split the text into sentences
chunks = sent_tokenize(text)for i, chunk in enumerate(chunks):print(f"块 {i+1}: {len(chunk)}: {chunk}")
块 1: 127: The Earth's atmosphere is composed of layers, including the troposphere, stratosphere, mesosphere, thermosphere, and exosphere.
块 2: 108: The troposphere is the lowest layer where all weather takes place and contains 75% of the atmosphere's mass.
块 3: 115: Above this, the stratosphere contains the ozone layer, which protects the Earth from harmful ultraviolet radiation.

这里使用nltk_data是手动下载的。

Fixed_length_chunks

def fixed_length_chunks(text, chunk_size):return [text[i:i+chunk_size] for i in range(0, len(text), chunk_size)]chunks = fixed_length_chunks(text, 100)  # 假设我们想要100个字符的块for i, chunk in enumerate(chunks):print(f"块 {i+1}: {len(chunk)}: {chunk}")
块 1: 100: The Earth's atmosphere is composed of layers, including the troposphere, stratosphere, mesosphere, t
块 2: 100: hermosphere, and exosphere. The troposphere is the lowest layer where all weather takes place and co
块 3: 100: ntains 75% of the atmosphere's mass. Above this, the stratosphere contains the ozone layer, which pr
块 4: 52: otects the Earth from harmful ultraviolet radiation.

Chunks with overlapping window

def sliding_window_chunks(text, chunk_size, stride):return [text[i:i+chunk_size] for i in range(0, len(text), stride)]chunks = sliding_window_chunks(text, 100, 50)  # 100个字符的块,步长为50for i, chunk in enumerate(chunks):print(f"块 {i+1}: {len(chunk)}: {chunk}")
块 1: 100: The Earth's atmosphere is composed of layers, including the troposphere, stratosphere, mesosphere, t
块 2: 100: uding the troposphere, stratosphere, mesosphere, thermosphere, and exosphere. The troposphere is the
块 3: 100: hermosphere, and exosphere. The troposphere is the lowest layer where all weather takes place and co
块 4: 100:  lowest layer where all weather takes place and contains 75% of the atmosphere's mass. Above this, t
块 5: 100: ntains 75% of the atmosphere's mass. Above this, the stratosphere contains the ozone layer, which pr
块 6: 100: he stratosphere contains the ozone layer, which protects the Earth from harmful ultraviolet radiatio
块 7: 52: otects the Earth from harmful ultraviolet radiation.
块 8: 2: n.

RecursiveCharacterTextSplitter from langchain

from langchain.text_splitter import RecursiveCharacterTextSplittertext = '''The Earth's atmosphere is a layer of gases surrounding the planet Earth and retained by Earth's gravity. 
It contains roughly 78% nitrogen and 21% oxygen, with trace amounts of other gases. 
The atmosphere protects life on Earth by absorbing ultraviolet solar radiation and reducing temperature extremes between day and night.
'''splitter = RecursiveCharacterTextSplitter(chunk_size = 150,chunk_overlap = 20,length_function = len,
)
trunks = splitter.split_text(text)
for i, chunk in enumerate(trunks):print(f"块 {i+1}: {len(chunk)}: {chunk}")
块 1: 104: The Earth's atmosphere is a layer of gases surrounding the planet Earth and retained by Earth's gravity.
块 2: 83: It contains roughly 78% nitrogen and 21% oxygen, with trace amounts of other gases.
块 3: 135: The atmosphere protects life on Earth by absorbing ultraviolet solar radiation and reducing temperature extremes between day and night.

中文情形

按照sentence来切分

通过正则表达式,将句子末尾的标点符号识别并划分开来。

import retext = "在这里,我们有一段超过200字的中文文本作为输入例子。这段文本是关于自然语言处理的简介。自然语言处理(NLP)是计算机科学、人工智能和语言学的交叉领域,它旨在让计算机能够理解和处理人类语言。在这一领域中,机器学习技术扮演着核心角色。通过使用各种算法,计算机可以解析、理解、甚至生成人类可以理解的语言。这一技术已广泛应用于机器翻译、情感分析、自动摘要、实体识别等多个方面。随着深度学习技术的发展,自然语言处理的准确性和效率都得到了显著提升。当前,一些高级的NLP系统已经能够完成复杂的语言理解任务,例如问答系统、语音识别和对话系统等。自然语言处理的研究不仅有助于改善人机交互,而且对于提高机器的自主性和智能化水平也具有重要意义。"
# 正则表达式匹配中文句子结束的标点符号
sentences = re.split(r'(。|?|!|\…\…)', text)
# 重新组合句子和结尾的标点符号
chunks = [sentence + (punctuation if punctuation else '') for sentence, punctuation in zip(sentences[::2], sentences[1::2])]
for i, chunk in enumerate(chunks):print(f"块 {i+1}: {len(chunk)}: {chunk}")
块 1: 27: 在这里,我们有一段超过200字的中文文本作为输入例子。
块 2: 17: 这段文本是关于自然语言处理的简介。
块 3: 51: 自然语言处理(NLP)是计算机科学、人工智能和语言学的交叉领域,它旨在让计算机能够理解和处理人类语言。
块 4: 21: 在这一领域中,机器学习技术扮演着核心角色。
块 5: 34: 通过使用各种算法,计算机可以解析、理解、甚至生成人类可以理解的语言。
块 6: 35: 这一技术已广泛应用于机器翻译、情感分析、自动摘要、实体识别等多个方面。
块 7: 34: 随着深度学习技术的发展,自然语言处理的准确性和效率都得到了显著提升。
块 8: 47: 当前,一些高级的NLP系统已经能够完成复杂的语言理解任务,例如问答系统、语音识别和对话系统等。
块 9: 47: 自然语言处理的研究不仅有助于改善人机交互,而且对于提高机器的自主性和智能化水平也具有重要意义。

按照固定字符数切分

def split_by_fixed_char_count(text, count):return [text[i:i+count] for i in range(0, len(text), count)]# 假设我们按照每100个字符来切分文本
chunks = split_by_fixed_char_count(text, 100)
for i, chunk in enumerate(chunks):print(f"块 {i+1}: {len(chunk)}: {chunk}")
块 1: 100: 在这里,我们有一段超过200字的中文文本作为输入例子。这段文本是关于自然语言处理的简介。自然语言处理(NLP)是计算机科学、人工智能和语言学的交叉领域,它旨在让计算机能够理解和处理人类语言。在这一领域
块 2: 100: 中,机器学习技术扮演着核心角色。通过使用各种算法,计算机可以解析、理解、甚至生成人类可以理解的语言。这一技术已广泛应用于机器翻译、情感分析、自动摘要、实体识别等多个方面。随着深度学习技术的发展,自然语
块 3: 100: 言处理的准确性和效率都得到了显著提升。当前,一些高级的NLP系统已经能够完成复杂的语言理解任务,例如问答系统、语音识别和对话系统等。自然语言处理的研究不仅有助于改善人机交互,而且对于提高机器的自主性和
块 4: 13: 智能化水平也具有重要意义。

按照固定sentence数切分

def split_by_fixed_sentence_count(sentences, count):return [sentences[i:i+count] for i in range(0, len(sentences), count)]# 假设我们按照每5个句子来切分文本
chunks = split_by_fixed_sentence_count(sentences, 5)for i, chunk in enumerate(chunks):print(f"块 {i+1}: {len(chunk)}: {chunk}")
块 1: 5: ['在这里,我们有一段超过200字的中文文本作为输入例子', '。', '这段文本是关于自然语言处理的简介', '。', '自然语言处理(NLP)是计算机科学、人工智能和语言学的交叉领域,它旨在让计算机能够理解和处理人类语言']
块 2: 5: ['。', '在这一领域中,机器学习技术扮演着核心角色', '。', '通过使用各种算法,计算机可以解析、理解、甚至生成人类可以理解的语言', '。']
块 3: 5: ['这一技术已广泛应用于机器翻译、情感分析、自动摘要、实体识别等多个方面', '。', '随着深度学习技术的发展,自然语言处理的准确性和效率都得到了显著提升', '。', '当前,一些高级的NLP系统已经能够完成复杂的语言理解任务,例如问答系统、语音识别和对话系统等']
块 4: 4: ['。', '自然语言处理的研究不仅有助于改善人机交互,而且对于提高机器的自主性和智能化水平也具有重要意义', '。', '']

使用RecursiveCharacterTextSplitter

from langchain.text_splitter import RecursiveCharacterTextSplittertext = """
在这里,我们有一段超过200字的中文文本作为输入例子。这段文本是关于自然语言处理的简介。
自然语言处理(NLP)是计算机科学、人工智能和语言学的交叉领域,它旨在让计算机能够理解和处理人类语言。
在这一领域中,机器学习技术扮演着核心角色。通过使用各种算法,计算机可以解析、理解、甚至生成人类可以理解的语言。
这一技术已广泛应用于机器翻译、情感分析、自动摘要、实体识别等多个方面。随着深度学习技术的发展,自然语言处理的准确性和效率都得到了显著提升。
当前,一些高级的NLP系统已经能够完成复杂的语言理解任务,例如问答系统、语音识别和对话系统等。自然语言处理的研究不仅有助于改善人机交互,而且对于提高机器的自主性和智能化水平也具有重要意义。
"""splitter = RecursiveCharacterTextSplitter(chunk_size = 150,chunk_overlap = 0,length_function = len,
)trunks = splitter.split_text(text)
for i, chunk in enumerate(trunks):print(f"块 {i+1}: {len(chunk)}: {chunk}")
块 1: 149: 在这里,我们有一段超过200字的中文文本作为输入例子。这段文本是关于自然语言处理的简介。自然语言处理(NLP)是计算机科学、人工智能和语言学的交叉领域,它旨在让计算机能够理解和处理人类语言。在这一领域中,机器学习技术扮演着核心角色。通过使用各种算法,计算机可以解析、理解、甚至生成人类可以理解的语言
块 2: 150: 。这一技术已广泛应用于机器翻译、情感分析、自动摘要、实体识别等多个方面。随着深度学习技术的发展,自然语言处理的准确性和效率都得到了显著提升。当前,一些高级的NLP系统已经能够完成复杂的语言理解任务,例如问答系统、语音识别和对话系统等。自然语言处理的研究不仅有助于改善人机交互,而且对于提高机器的自主性
块 3: 14: 和智能化水平也具有重要意义。

文本向量化

简史:word2vec->Bert->Transformer

在RAG业务中,我们的目的就是将trunk转换为vectorvector之间可以计算“相似度”,而最流行的相似度衡量方式就是余弦相似度

接着,将问题也转为vector,就可以实现问题与语料之间的匹配。

def get_embedding(text, model="text-embedding-ada-002"):text = text.replace("\n", " ")return client.embeddings.create(input = [text], model=model).data[0].embedding

这里使用OpenAI的text-embedding-ada作为encoding model。

import numpy as npdef cosine_similarity(A, B):dot_product = np.dot(A, B)norm_A = np.linalg.norm(A)norm_B = np.linalg.norm(B)return dot_product / (norm_A * norm_B)
emb1 = get_embedding("大模型的应用场景很多")
emb2 = get_embedding("大模型")
emb3 = get_embedding("大模型有很多应用场景")
emb4 = get_embedding("Java开发")
cosine_similarity(emb1, emb2)
0.9227828346114963
cosine_similarity(emb1, emb4)
0.796131924008725

向量数据库

上面说到,问题与语料的匹配是实现RAG的关键。假设现已有一个问题vector,以及语料经过切分、向量化之后的一大堆向量,接下来的难点就是如何快速找到与问题vector最相似的语料vector。向量数据库就是为了有效储存语料向量,使得检索更高效而诞生的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/884236.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

沁恒CH32V307EVT-R1开发板使用说明

首先下载官方的资料:CH32V307EVT.ZIP - 南京沁恒微电子股份有限公司 解压后CH32V307EVT\EVT\EXAM里的就是官方的示例代码,CH32V307EVT\EVT\PUB下面的是文档 CH32V307EVT/EVT/PUB/CH32V30x评估板说明书.pdf:是各个开发板的介绍 CH32V307EVT/EVT/PUB/CH32V30xSCH.pdf:是开发板…

YASKAWA机器人NX100控制柜无法启动维修

当YASKAWA机器人NX100控制柜无法启动时,这无疑是一个典型的机器人故障。首先要做的是对故障进行初步的排查。检查电源连接是否正常,是否存在松动或者断电的情况。这可能是最常见的原因,但也容易被忽视。同时,观察控制柜的指示灯状态,如果指示灯完全不亮,可能是电源供应模…

微信小程序ReferenceError:xxx is not defined报错解决办法

我在开发的过程中想要打印adressInfo的数据信息,却发现一直报错,而AppData里显示adressInfo是被成功赋值的。 那么问题就出现在了"console.log(adressInfo)"这条语句中 只需要把"adressInfo"改为"this.data.adressInfo"报错问题就能够成功解决…

蒙德里安的梦想(状态压缩)

1.首先就是每列状态的表示,如果该列有横着的方块就用1,表示否则就用零,一共n行最多有n个一就是2^n-1最少0个一就是0,所以0<=i<n;j表示i位移的个数,i最多n位所以最多位移n-1位来检验i每一位,如果是1就检验cnt来检验是否有连续奇数个0,最后还要再检验一次来检验高位…

原子物理之光电效应

光电效应的原理、实验细节和动态分析普朗克能量子 定义 普朗克认为,带电微粒(高中阶段主要研究电子)辐射或吸收能量的时候,只能辐射或吸收某个最小能量值的整数倍。这个不可再分的最小能量值就叫做能量子。 通常的,我们认为光子也是一种能量子。 能量子大小 公式: \[ε=…

钜泉代理商,HT6453钜泉M4电能专用MCU,集成1M Flash、32位定时器、CAN总线

HT6453微控制器内部集成了:32位ARMCortex-M4F处理器,多个16位和32位的定时器,DMA控制器,SPI通信接口,I2C通信接口,USART/UART通信接口,SDIO接口,CAN总线控制器,外部存储控制器XMC,USB2.0全速设备接口,HICK自动时钟校准ACC,12位ADC,12位DAC和PVM模块等外设。大量的…

项目管理5阶段

目录背景和价值参考资料 背景和价值 项目的生命周期共包括5个部分,因为每个部分都会包含至少两个相对独立又相互联系的过程,所以又称“过程组”​。每个过程组的主要工作如下: 启动:确立项目的合法地位和总体要求(目标)​,宣布项目正式立项(上马)​。 规划:编制项目计…

图解支付账务系统核心设计

在金融科技领域,支付账务系统的设计和实现是构建高效、安全支付平台的关键。本文深入探讨了支付账务系统的核心设计,从账户管理、记账处理到清结算与会计服务,为读者揭示了支付账务系统设计的复杂性和重要性。通过详细的图解和案例分析,文章为支付系统设计提供了宝贵的理论…

前端初探 Vue.js 第 1 期:创建第一个Vue项目

Vue.js入门第一期Vue.js 作为前端三大框架之一,一直享有盛誉。本文我们将来实现第一个Vue项目。 准备安装 Node.js https://nodejs.org/ 安装 VSCode https://code.visualstudio.com/Download输入npm -v以检查是否安装成功,建议下载最新LTS版本即可。笔者所用为10.8.2 配置镜…

PLC S7-200 Smart 计算器(CTU、CTU、CTUD)出现编译错误:错误46、错误58、错误59 时的注意事项

作为新手,在使用计数器(CTU)编写程序如下: 1、点击按钮I0.0,实现计数器(C0)加计数,当到达10时C0接通 在该程序中因为不需要对C0进行复位操作,所以将计数器C0的 R 端悬空。程序看似没问题,单编译时会报 错误46 如下:这里出现问题的原因是:R端虽然不一定必须(起作用…

ABB IRB6700机械臂维修减速机抖动故障检测

当ABB IRB6700机器人减速机出现抖动问题时,就需要及时进行维修,这涉及到专业的ABB机器人维修、工业机器人维修以及机器人减速机维修知识。减速机抖动会导致ABB IRB6700机器人在执行任务时的定位精度下降。在工业生产中,对于诸如汽车零部件组装、电子产品制造等对精度要求极高…

Vue3相对于Vue2的提升|区别

https://cn.vuejs.org/guide/best-practices/performance Vue框架基于MVVM的架构进行开发 M - Model:数据层(数据逻辑处理 V - View: 视图层 VM - ViewModel: 数据的响应和渲染(连接数据层和视图层的桥梁)Vue通过观察者模式和采用代理的方式进行数据劫持和数据响应,从而实现…