人人可以做的RAG检索增强生成实战

news2024/9/20 18:38:35

AI大模型持续火爆,我作为IT人员从业者也想参与一下,但是奈何大模型的参数太大,动辄上亿的参数需要很大的算力,GPU卡必不可少,对于手头羞涩的小白,不想投几千大洋只为了满足自己的好奇心。这真是个难题。

现在好了,微软推出了PHI模型,它是一系列小型语言模型(small language models,SLMs),代表了微软研究院在小规模语言模型领域的探索和成果。微软的 PHI 系列模型的发展不仅证明了小模型在特定领域内的强大潜力,也为如何通过精心设计的训练策略和数据选择来提升模型性能提供了宝贵的经验。对AI大模型的小白,它也是一个用家用PC来学习和调试AI模型的利器。

现在开始。

  1. RAG 检索增强生成工作流程

1. 数据预处理
对大量的原始文本数据进行收集和整理。
将这些文本数据分割成适当的块,例如段落或句子。
对每个数据块进行向量化处理,将其转换为可以进行相似性计算的向量表示。
2. 构建索引
使用预处理后的数据向量创建向量索引。这个索引类似于一个数据库的目录,能够快速找到与给定查询相似的数据块。
3. 接收用户查询
用户向系统输入问题或查询请求。
4. 查询向量化
系统将用户的查询转换为向量形式,以便与之前创建的索引中的向量进行比较和匹配。
5. 检索相关数据
在向量索引中进行搜索,找到与查询向量最相似的前 k 个数据块。
6. 提取相关文本
从数据库中提取检索到的相关数据块的实际文本内容。
7. 整合输入给模型
将提取的相关文本与用户的原始查询整合在一起,形成一个完整的输入提示,提供给语言模型。
8. 生成回答
语言模型基于整合后的输入提示生成最终的回答

2、这里直接使用NVIDIA网站的 phi-3-small-128k-instruct

llm = ChatNVIDIA(model="ai-phi-3-small-128k-instruct", nvidia_api_key=nvapi_key, max_tokens=512)
result = llm.invoke("泰坦尼克号的导演是谁?")
print(result.content)
《泰坦尼克号》的导演是乔治·哈维(George Lucas)。这部电影于1977年上映,由乔治·哈维执导,且由雷·格林斯特里克、汤姆·布莱恩斯和罗伯特·杰克逊等著名演员主演。这部电影不仅在票房上取得了巨大成功,而且还对后来的科幻电影产生了深远的影响。

直接使用该模型产生了AI幻觉,它在一本正经的胡说八道。

3、初始化向量库

from langchain_nvidia_ai_endpoints import NVIDIAEmbeddings

embedder = NVIDIAEmbeddings(model="ai-embed-qa-4")

4、使用文本数据集并进行数据处理

import os
from tqdm import tqdm
from pathlib import Path

# Here we read in the text data and prepare them into vectorstore
ps = os.listdir("./zh_data/")
data = []
sources = []
for p in ps:
    if p.endswith('.txt'):
        path2file="./zh_data/"+p
        with open(path2file,encoding="utf-8") as f:
            lines=f.readlines()
            for line in lines:
                if len(line)>=1:
                    data.append(line)
                    sources.append(path2file)
documents=[d for d in data if d != '\n']
len(data), len(documents), data[0]
(1,
 1,
 '泰坦尼克号是一部 1997 年美国史诗爱情灾难片,由詹姆斯·卡梅隆执导、编剧、制作和联合剪辑。该片以 1912 年泰坦尼克号沉没事件为基础,融合了历史和虚构的元素。凯特·温斯莱特和莱昂纳多·迪卡普里奥饰演不同社会阶层的成员,他们在泰坦尼克号的处女航中坠入爱河。比利·赞恩、凯西·贝茨、弗朗西斯·费舍尔、格洛丽亚·斯图尔特、伯纳德·希尔、乔纳森·海德、维克多·加伯和比尔·帕克斯顿也参演了这部电影。\\n卡梅隆的这部电影的灵感来自于他对沉船的迷恋。他认为,一个夹杂着人员伤亡的爱情故事对于传达灾难的情感影响至关重要。该片于 1995 年 9 月 1 日开始拍摄,当时卡梅隆拍摄了泰坦尼克号沉船的实际镜头。研究船上的现代场景是在卡梅伦拍摄沉船时使用的 Akademik Mstislav Keldysh 号上拍摄的。使用比例模型、计算机生成的图像以及巴哈工作室建造的泰坦尼克号重建模型来重现沉没过程。该片由派拉蒙影业和二十世纪福克斯公司共同资助;前者负责在北美发行,而后者则在国际上发行影片。这是当时制作成本最高的电影,制作预算为 2 亿美元。拍摄时间为1996年7月至1997年3月。\\n《泰坦尼克号》于 1997 年 12 月 19 日上映。它因其视觉效果、表演(尤其是迪卡普里奥、温斯莱特和斯图尔特的表演)、制作价值、导演、配乐、摄影、故事和情感深度而受到好评。除其他奖项外,它获得了14项奥斯卡金像奖提名,并赢得了11项奖项,其中包括最佳影片和最佳导演,追平了《宾虚》(1959 年),成为获得奥斯卡奖最多的电影。 《泰坦尼克号》的全球首映票房超过 18.4 亿美元,是第一部突破 10 亿美元大关的电影。它是有史以来票房最高的电影,直到卡梅隆的下一部电影《阿凡达》(2009 年) 在 2010 年超越了它。经过多次重新上映,该电影的全球总票房达到 22.57 亿美元,成为第二部票房收入超过 100 万美元的电影。 《阿凡达》之后全球票房达到 20 亿美元。它于2017年被选入美国国家电影登记处保存。')

5、将文档处理到向量库并将其保存到磁盘

# Here we create a vector store from the documents and save it to disk.
from operator import itemgetter
from langchain.vectorstores import FAISS
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain.text_splitter import CharacterTextSplitter
from langchain_nvidia_ai_endpoints import ChatNVIDIA
import faiss

# 只需要执行一次,后面可以重读已经保存的向量存储
text_splitter = CharacterTextSplitter(chunk_size=400, separator=" ")
docs = []
metadatas = []

for i, d in enumerate(documents):
     splits = text_splitter.split_text(d)
     #print(len(splits))
     docs.extend(splits)
     metadatas.extend([{"source": sources[i]}] * len(splits))

store = FAISS.from_texts(docs, embedder , metadatas=metadatas)
store.save_local('./zh_data/nv_embedding')

6、进行验证

# Load the vectorestore back.
store = FAISS.load_local("./zh_data/nv_embedding", embedder,allow_dangerous_deserialization=True)

retriever = store.as_retriever()

prompt = ChatPromptTemplate.from_messages(
    [
        (
            "system",
            "Answer solely based on the following context:\n<Documents>\n{context}\n</Documents>",
        ),
        ("user", "{question}"),
    ]
)

chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)

chain.invoke("泰坦尼克号的导演是谁?")

' 泰坦尼克号的导演是詹姆斯·卡梅隆。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【车载开发系列】单片机烧写的文件

【车载开发系列】单片机烧写的文件 【车载开发系列】单片机烧写的文件 【车载开发系列】单片机烧写的文件一. 什么是bin二. 什么是Hex三. 什么是Motorola S-record&#xff08;S19&#xff09;四. ELF格式五. Bin与Hex文件的比对六. 单片机烧写文件的本质 一. 什么是bin bin是…

回顾 | 瑞云科技亮相ICIC2024,虚拟仿真实训云平台引关注

2024年8月7日&#xff0c;天津市虚拟仿真学会主办的第二十届智能计算国际会议&#xff08;ICIC2024&#xff09;——虚拟仿真技术交流平行会议暨天津市虚拟仿真学会2024年暑期技术交流会在天津盛大召开。本次大会汇聚来自全国的顶尖专家、学者和行业领袖&#xff0c;共同探讨虚…

Notepad--文本编辑工具 for Mac教程【苹果电脑-简单轻松上手-免费Mac软件推荐】

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff0c;将其拖入应用程序中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功 三、运行测试解决“软件已损坏&#xff0c;无法打开”问题&#xff0c;若没有该问题&#xff0c;可…

TI DSP TMS320F280025 Note1:工程模板Template创建

TMS320F280025工程模板Template创建 文章目录 TMS320F280025工程模板Template创建新建一个ccs工程为需要添加的一些文件新建文件夹从c2000中拷贝官方基础文件到工程中cmd链接文件common头文件和源文件headers头文件和源文件库函数文件添加driverlib.lib文件 添加文件的路径文件…

【微信小程序】生命周期

1. 什么是生命周期 2. 生命周期的分类 3. 什么是生命周期函数 4. 生命周期函数的分类 5. 应用的生命周期函数 小程序的应用生命周期函数需要在app.js中进行声明&#xff0c;示例代码如下&#xff1a; 6. 页面的生命周期函数 小程序的页面生命周期函数需要在页面的 .js 文件…

将 hugo 博客搬迁到服务器

1. 说明 在 Ubuntu 22.04 上使用 root 账号&#xff0c;创建普通账号&#xff0c;并赋予 root 权限。 演示站点&#xff1a;https://woniu336.github.io/ 魔改hugo主题: https://github.com/woniu336/hugo-magic 2. 服务器配置 建立 git 用户 adduser git安装 git sudo apt …

蓝图中结构体改变后,要重新创建widget

发现了一个怪现象&#xff0c;在更改结构体后&#xff0c;界面上出不来相应的信息了&#xff0c;断掉传递到界面上的线后&#xff0c;再重新连接&#xff0c;发现错误“只有完全匹配的结构才是兼容的”&#xff0c;删除后&#xff0c;重新创建widget&#xff0c;正常。 如下图…

【STM32项目】在FreeRtos背景下的实战项目的实现过程(二)

个人主页~ 实战项目的实现过程&#xff08;一&#xff09;~ 实战项目的实现过程 二、初步了解各个外设硬件1、OLED模块2、GPS模块3、MPU6050模块4、超声测距模块5、温度测控模块6、语音模块7、SIM模块8、按键模块 三、查阅资料1、查看手册2、查找例程 四、研究硬件功能1、OLED…

OpenCv图像处理: 时域滤波与频域滤波

时域滤波&#xff1a; 空间域滤波的步骤一般如下&#xff1a; 1. 选择滤波器 选择一种低通滤波器&#xff0c;常见的包括&#xff1a; 均值滤波&#xff08;平均滤波器&#xff09;高斯滤波&#xff08;Gaussian filter&#xff09; 2. 定义滤波器核 根据选择的滤波器类型&…

【卡码网Python基础课 19.洗盘子】

目录 题目描述与分析一、栈二、栈的操作三、代码编写 题目描述与分析 题目描述&#xff1a; 在餐厅里&#xff0c;洗盘子的工作需要使用到栈这种数据结构。 假设你手里有一个盘子堆放区。现在需要模拟洗盘子的过程&#xff0c;每个盘子都有一个编号。 盘子堆放区操作说明&…

同一台电脑上安装不同版本的nodejs(搭配VSCode)

今天拉取了一个前后端分离的项目&#xff0c;运行前端的时候&#xff0c;出现node版本不匹配的情况。 本文章将从安装node.js开始到VSCode使用进行讲解 1、去官网下载node版本 以16版本为例&#xff0c;需要哪个版本&#xff0c;就在网址上把版本号替换即可 https://nodejs.o…

在ADS中使用传输端口参数构建理想元器件模型---以3dB电桥为例

在ADS中使用传输端口参数&#xff08;S、Z、Y、ABCD&#xff09;构建理想元器件模型—以3dB电桥为例 本文工程文件下载&#xff1a;在ADS中使用传输端口参数构建理想元器件模型-以3dB电桥为例-工程文件 目录 在ADS中使用传输端口参数&#xff08;S、Z、Y、ABCD&#xff09;构建…

8月18日笔记

目标不出网场景 在目标环境完全不出网的情况下&#xff0c;即所有的网络通信如SMB&#xff08;Server Message Block&#xff09;、DNS&#xff08;Domain Name System&#xff09;甚至包括TCP&#xff08;Transmission Control Protocol&#xff09;都不允许与外部网络进行交…

使用极限网关实现 ES 跨集群搜索

使用 ES 的小伙伴&#xff0c;有没有在用跨集群搜索的&#xff1f; 熟悉 ES 的小伙伴都知道&#xff0c;ES 本身就能实现跨集群搜索&#xff0c;那为啥还要聊这个&#xff1f;试想一下&#xff0c;如果集群都上线投产了&#xff0c;才出现跨集群搜索需求&#xff0c;那么可能出…

重磅!RISC-V+OpenHarmony平板电脑发布

仟江水商业电讯&#xff08;8月18日 北京 委托发布&#xff09;RISC-V作为历史上全球发展速度最快、创新最为活跃的开放指令架构&#xff0c;正在不断拓展高性能计算领域的边界。OpenHarmony是由开放原子开源基金会孵化并运营的开源项目&#xff0c;已成为发展速度最快的智能终…

Chapter 40 Socket网络编程

欢迎大家订阅【Python从入门到精通】专栏&#xff0c;一起探索Python的无限可能&#xff01; 文章目录 前言一、Socket网络编程二、Socket服务端编程三、Socket客户端编程四、服务端与客户端相互通讯 前言 在现代计算机网络中&#xff0c;Socket&#xff08;套接字&#xff09…

【题解】—— LeetCode一周小结33

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结32 12.实现一个魔法字典 题目链接&#xff1a;676. 实现一个魔…

Kettle根据时间戳同步数据实现

1 Kettle总体步骤 更多数据实时同步方案&#xff0c;请参考笔者的另一篇博文&#xff1a;大数据时代&#xff0c;数据实时同步解决方案的思考—最全的数据同步总结 由于Kettle自身的特殊性以及在多个步骤中kettle自身处理数据库事务的特殊性&#xff0c;尝试了很多种方案&…

win11内存占用高的解决办法

win11莫名奇妙的总是内存爆满&#xff0c;真的抽象&#xff0c;16g根本不够用。尝试各种方法看看能不能解决… 方法一 关闭快速启动 win11系统&#xff0c;自带快速开机功能&#xff0c;可能用较大内存&#xff0c;关闭看看。控制面板找到电源设置关闭快速启动。 如果没找到要…

C++ | Leetcode C++题解之第345题反转字符串中的元音字母

题目&#xff1a; 题解&#xff1a; class Solution { public:string reverseVowels(string s) {auto isVowel [vowels "aeiouAEIOU"s](char ch) {return vowels.find(ch) ! string::npos;};int n s.size();int i 0, j n - 1;while (i < j) {while (i < …