Rag技术----项目博客(六)

RAG

定义:检索增强生成(Retrieval Augmented Generation),简称 RAG,已经成为当前最火热的LLM应用方案。

目的:通过提供相关领域数据库通过问题检索信息,将相关信息合并到Prompt中,增强模型的专业性。

深入浅出RAG技术:

RAG=检索技术+LLM提示

//LLM提示就是之前文章中提到过的promt工程,这里不再赘述,主要理解检索技术

检索技术

2019年,Faiss就实现了基于嵌入的向量搜索技术,但是 RAG 推动了向量搜索领域的发展。比如 chroma、weaviate.io和 pinecone这些基于开源搜索索引引擎(主要是 faiss 和 nmslib)向量数据库初创公司,最近增加了输入文本的额外存储和其他工具。
向量化是将文本数据转化为向量矩阵的核心过程,通常使用embedding模型来实现,常用的模型:

模型名称描述
ChatGPT-EmbeddingChatGPT-Embedding由OpenAI公司提供,以接口形式调用。
ERNIE-Embedding V1ERNIE-Embedding V1由百度公司提供,依赖于文心大模型能力,以接口形式调用。
M3EM3E是一款功能强大的开源Embedding模型,包含m3e-small、m3e-base、m3e-large等多个版本,支持微调和本地部署。
BGEBGE由北京智源人工智能研究院发布,同样是一款功能强大的开源Embedding模型,包含了支持中文和英文的多个版本,同样支持微调和本地部署。

本项目使用的模型为BAAI/bge-large-zh-v1.5BAAI/bge-small-zh,特点是体积小且适合中文。
向量数据库:数据向量化后构建索引,并写入数据库的过程可以概述为数据入库过程,适用于RAG场景的数据库包括:FAISS、Chromadb、ES、milvus等,本项目选择的数据库为FAISS。

当我们要在数据库中寻找与问题相关的数据时常用的方法:
常见计算方法:k-临近
数据距离计算方法:欧式距离、曼哈顿距离、明科夫斯基距离。

RAG工作原理:

数据库构建并应用

前期准备

环境
有两个最著名的基于 LLM 的管道和应用程序的开源库——LangChain 和 LlamaIndex,受 ChatGPT 发布的启发,它们在 2022 年 10 月和 11 月创立,并在 2023 年获得大量采用。
本项目使用的开源库为LangChain

数据积累
数据来源:https://github.com/LawRefBook/Laws
该项目目的是收集各类法律法规、部门规章、案例等,并将其按照章节等信息进行了处理。
项目提供了request.py 脚本,支持从 BAAI/bge-large-zh-v1.5 爬取最新的法律法规。

数据库构建

目录结构

读取数据

# 遍历 Markdown 文件
docs = []
root_dir = Path("data/Laws-master/LAWS")
md_files = {} 
for dir_name in os.listdir(root_dir):dir_path = os.path.join(root_dir, dir_name)if os.path.isdir(dir_path):  # 确保是文件夹md_files[dir_name] = {}for file_name in os.listdir(dir_path):if file_name.endswith(".md"):

选择分词器并加载嵌入模型

embedding_model = HuggingFaceEmbeddings(model_name="../models/BAAI/bge-small-zh")
splitter = MarkdownTextSplitter(chunk_size=500, chunk_overlap=50)

构建数据库

 file_path = os.path.join(dir_path, file_name)loader = TextLoader(str(file_path), encoding='utf-8')raw_docs = loader.load()split_docs = splitter.split_documents(raw_docs)docs.extend(split_docs)
vectorstore = FAISS.from_documents(docs, embedding_model)
vectorstore.save_local("faiss_index")

数据库应用
 

def rag_ask(question, top_k=2):# 检索相关法条docs = db.similarity_search(question, k=top_k)# print(docs)#生成前k个相关的问题context = "\n\n".join([doc.page_content for doc in docs])print(context)prompt = f"""你是中国法律助手,请根据以下法条内容回答问题:
【法条内容】:
{context}【用户问题】:{question}
【回答】:
"""print(prompt)response = pipe(prompt, max_new_tokens=512)[0]['generated_text']print(response[len(prompt):].strip())

效果展示
prompt


回答结果

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

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

相关文章

设计模式——外观设计模式(结构型)

摘要 本文介绍了外观设计模式,它是一种结构型设计模式,通过引入一个外观类来封装复杂子系统的调用细节,对外提供简单统一的接口。文中通过生活类比、关键角色介绍、使用场景分析以及结构说明等方面对这一模式进行了全面阐述,还涉…

LabVIEW磁悬浮轴承传感器故障识别

针对工业高端装备中主动磁悬浮轴承(AMB)的位移传感器故障检测需求,基于 LabVIEW 平台构建了一套高精度故障识别系统。通过集成品牌硬件与 LabVIEW 的信号处理能力,实现了传感器探头故障的实时监测与精准定位,解决了传统…

集成学习三种框架

集成学习通过组合多个弱学习器构建强学习器,常见框架包括Bagging(装袋)、Boosting(提升) 和Stacking(堆叠) 一、Bagging(自助装袋法) 核心思想 从原始数据中通过有放回…

PCI DSS培训记录

22日上午: 整体PCI DSS 结构分享VISA分享全球欺诈风险动态 信用卡被偷枚举攻击依然是最为主要的安全威胁之一(枚举验证码),增加3DS验证防护勒索软件和信息泄漏攻击欺诈分子对AI技术的兴趣日益增加,如换脸软件过验证基于NFC技术利用非接交易进行欺诈成为新的攻击手段,如NF…

数据安全中心是什么?如何做好数据安全管理?

目录 一、数据安全中心是什么 (一)数据安全中心的定义 (二)数据安全中心的功能 1. 数据分类分级 2. 访问控制 3. 数据加密 4. 安全审计 5. 威胁检测与响应 二、数据安全管理的重要性 三、如何借助数据安全中心做好数据安…

黑马Java面试笔记之 微服务篇(业务)

一. 限流 你们项目中有没有做过限流?怎么做的? 为什么要限流呢? 一是并发的确大(突发流量) 二是防止用户恶意刷接口 限流的实现方式: Tomcat:可以设置最大连接数 可以通过maxThreads设置最大Tomcat连接数,实现限流,但是适用于单体架构 Nginx:漏桶算法网关,令牌桶算法自定…

PostgreSQL的扩展 passwordcheck

PostgreSQL的扩展 passwordcheck passwordcheck 是 PostgreSQL 内置的一个密码复杂度检查扩展,用于强制实施基本的密码策略。 一、扩展概述 功能:在创建或修改用户密码时检查密码复杂度目的:防止使用过于简单的密码适用版本:Po…

Go语言学习-->编译器安装

Go语言学习–>编译器安装 Go采用的是UTF-8编码的文本文件存放源代码,理论上使用任何一款文本编辑器都可以做Go语言开发。这里推荐使用VS Code和Goland。 VS Code是微软开源的编辑器,而Goland是jetbrains出品的付费IDE。我们这里使用VS Code …

基于Android的一周穿搭APP的设计与实现 _springboot+vue

开发语言:Java框架:springboot AndroidJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7数据库工具:Navicat12开发软件:eclipse/myeclipse/ideaMaven包:Maven3.6 系统展示 APP登录 A…

井字棋——ai PK you

挑战人工智能,体验经典井字棋的对决!AI 拥有强大的逻辑计算能力,每一步都经过精准推演。你能战胜它吗?还是会被 AI 彻底碾压? 特点: 智能 AI,难度可调 极简界面,快速上手 实时胜负…

关于easyx头文件

一、窗口创建 &#xff08;1&#xff09;几种创建方式 #include<easyx.h>//easyx的头文件 #include<iostream> using namespace std;int main() {//创建一个500*500的窗口//参数为&#xff1a;长度&#xff0c;宽度&#xff0c;是否显示黑框&#xff08;无参为不…

【学习记录】Django Channels + WebSocket 异步推流开发常用命令汇总

文章目录 &#x1f4cc; 摘要&#x1f9f0; 虚拟环境管理✅ 创建虚拟环境✅ 删除虚拟环境✅ 激活/切换虚拟环境 &#x1f6e0;️ Django 项目管理✅ 查看 Django 版本✅ 创建 Django 项目✅ 创建 Django App &#x1f4ac; Channels 常用操作✅ 查看 Channels 版本 &#x1f50…

Java线程状态及其流转

在Java编程中&#xff0c;线程是一种重要的并发实体。为了更好地理解和管理多线程应用程序&#xff0c;我们需要清楚线程的不同状态及其流转机制。本文将详细介绍Java中线程的几种主要状态以及它们之间的转换关系。 一、线程状态概述 Java线程的生命周期有多个状态&#xff0…

LabVIEW双光子显微镜开发

基于LabVIEW 开发高性能双光子显微镜系统&#xff0c;聚焦于生物样本深层成像与纳米材料三维表征。实现了超快激光控制、多维数据采集与实时图像重建。系统采用飞秒激光光源与高精度振镜扫描模块&#xff0c;结合 LabVIEW 的 FPGA 实时控制能力&#xff0c;可对活体组织、荧光纳…

数据库操作-MySQL-4(JDBC编程)

JDBC&#xff1a;通过Java代码操作mysql数据库&#xff0c;数据库会提供一些API供我们调用 MySQL、Oracle、等API有差异&#xff0c;但是Java统一了所有接口&#xff0c;即JDBC&#xff1b; 原始api-驱动包&#xff08;类似转接头&#xff09;-统一的api-Java 驱动包&#xff1…

windows修改跃点数调整网络优先级

Windows有两个网卡&#xff0c;一个有线网卡&#xff0c;一个无线网卡&#xff0c;通过修改跃点数来调整优先使用的网卡&#xff0c;这种只是众多设置方式中的其中一种设置方式 文档编写时间&#xff1a;2025年6月 1.打开电脑的网络连接 cmd--ncpa.cpl 在cmd中运行ncpa.cpl可…

实验设计与分析(第6版,Montgomery著,傅珏生译) 第10章拟合回归模型10.9节思考题10.1 R语言解题

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅珏生译) 第10章拟合回归模型10.9节思考题10.1 R语言解题。主要涉及线性回归、回归的显著性、回归系数的置信区间。 vial <- seq(1, 10, 1) Viscosity <- c(160,171,175,182,184,181,188,19…

【深入 LangChain 的 Model I/O】提示设计、模型调用与输出解析全解析

目录 什么是 Model I/O&#xff1f; 一、提示模板&#xff08;PromptTemplate&#xff09; 1.1 什么是提示模板&#xff1f; 1.2 常见提示模板类型 二、模型调用&#xff08;Model Predict&#xff09; 三、输出解析&#xff08;Output Parser&#xff09; 综合示例&…

OD 算法题 B卷【跳格子2】

文章目录 跳格子2 跳格子2 小明和朋友玩跳格子游戏&#xff0c;有n个连续格子组成的圆圈&#xff0c;每个格子有不同的分数&#xff0c;小朋友可以选择从任意格子起跳&#xff0c;但是不能跳连续的格子&#xff0c;不能回头跳&#xff0c;也不能超过一圈&#xff0c;给定一个代…

客户线索商机怎么管?客户线索商机管理工具哪个好?

做销售、搞运营的朋友肯定都有过这种烦恼&#xff1a;每天收到海量客户线索&#xff0c;却不知道从哪条开始跟进&#xff1b;试了好几个管理工具&#xff0c;要么功能太复杂&#xff0c;要么用起来不趁手。其实选对客户线索商机管理工具&#xff0c;就像找到靠谱的 “销售小助手…