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

【课程总结】day29:大模型之深入了解Retrievers解析器

前言

在上一章【课程总结】day28:大模型之深入探索RAG流程中,我们对RAG流程中 文档读取(LOAD) -> 文档切分(SPLIT) -> 向量化(EMBED) -> 存储(STORE) 进行了深入了解,本章将接着深入了解 解析(Retrieval) 的使用

解析器简介

简介:在 RAG(Retrieval-Augmented Generation)流程中,Retrieval(检索)是关键环节,其主要目标是从大量文档或知识库中提取与用户查询相关的信息。

目的

  • 信息获取:根据用户的查询,从外部知识库中获取相关文档或片段,以增强生成模型的上下文信息。
  • 提高准确性:通过提供具体的、相关的信息,帮助生成模型(如语言模型)产生更准确和上下文相关的回答。

流程

  1. 用户查询:用户输入一个查询或问题。
  2. 检索器:使用检索算法(如 BM25、TF-IDF 或基于嵌入的检索)搜索知识库,找到与查询最相关的文档。
  3. 文档评分:对检索到的文档进行评分,通常依据相关性得分来排序。
  4. 返回结果:将最相关的文档或片段返回给生成模型。

解析器的基础使用

创建知识库

第一步:启动Chroma数据库

chroma run --path chroma_xiyou --port 8000

第二步:使用RAG基础流程:Load->Split->EMBED->STORE创建一个知识库

from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.document_loaders import PyMuPDFLoader
from langchain_chroma import Chroma
from chromadb import Settings
from chromadb import Client
from utils import get_ernie_models
import chromadb# 连接大模型
llm_ernie, chat_ernie, embed_ernie = get_ernie_models()# 初始化 HuggingFaceEmbeddings
embedding_function = HuggingFaceEmbeddings(model_name="bert-base-chinese")# 加载文档
pdf_loader = PyMuPDFLoader("testfiles/西游记.pdf")
documents = pdf_loader.load()# 切分文档
spliter = RecursiveCharacterTextSplitter(chunk_size=128, chunk_overlap=64)
docs = spliter.split_documents(documents)# 配置连接信息
client = chromadb.HttpClient(host='localhost', port=8000)chroma_db = Chroma(embedding_function=embedding_function,client=client
)batch_size = 6  # 每次处理的样本数量# 分批入库
for i in range(0, len(docs), batch_size):batch = docs[i:i + batch_size]  # 获取当前批次的样本print(f'Processing batch {i} to {i + batch_size}, total {len(batch)} samples')chroma_db.add_documents(documents=batch)  # 入库

说明:

  • 向量化说明:由于Qwen和百度千帆的向量接口限制较多,对于向量化西游记这本书来说,经常会遇到超出限制等问题,所以此处我将向量化接口换为HuggingFaceEmbeddings(),该接口可能会存在被Ban的风险,请自行更换向量化接口。
  • 测试文档:西游记下载地址请见夸克网盘:西游记

创建解析器

第三步:创建一个解析器

retriever = chroma_db.as_retriever()

创建chain链

创建chain链有两种方法:一种是管道符连接,一种是使用 create_retrieval_chain 。本章我们两种方法都做尝试,以便对比代码的写法。

方式一:传统的管道符构建chain
# RAG系统经典的 Prompt 
prompt = ChatPromptTemplate.from_messages([("human", """You are an assistant for question-answering tasks. Use the following pieces of retrieved context to answer the question. If you don't know the answer, just say that you don't know. Use three sentences maximum and keep the answer concise.Question: {question} Context: {context} Answer:""")
])def format_docs(docs):return "\n\n".join(doc.page_content for doc in docs)# RAG 链
rag_chain = ({"context": retriever | format_docs, "question": RunnablePassthrough()}| prompt| chat_ernie| StrOutputParser()
)rag_chain.invoke(input="孙悟空三打白骨精时,白骨精分别变成了哪些形态?")

运行结果:

方式二:使用create_retrieval_chain构建

相关文章:

  • 【C/C++】 秋招常考面试题最全总结(让你有一种相见恨晚的感觉)
  • spring如何解决循环依赖
  • 嵌入式linux裸机调试之windows、linux联合gdb
  • Gromacs——使用过程中暴露问题分析及学习
  • docker-文件复制(docker cp:用于在Docker主机和容器之间拷贝文件或目录)
  • 数学建模研赛总结
  • 【Linux】tar 压缩使用绝对路径时解压会出现多级文件夹
  • 新手教学系列——用 VSCode 实现高效远程开发
  • linux查看进程所在的目录
  • 硬件设计基础之闲聊千兆以太网
  • C99中的变长数组
  • 在Mac电脑上安装adb环境
  • 开源实战分享 | 新书:《大型语言模型实战手册》随书代码分享
  • [大语言模型] 情感认知在大型语言模型中的近期进展-2024-09-26
  • 腾讯云新开端口
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【node学习】协程
  • Angular 响应式表单之下拉框
  • css系列之关于字体的事
  • echarts花样作死的坑
  • Java 内存分配及垃圾回收机制初探
  • Java深入 - 深入理解Java集合
  • js数组之filter
  • Linux链接文件
  • Octave 入门
  • PHP的类修饰符与访问修饰符
  • Swoft 源码剖析 - 代码自动更新机制
  • Vue学习第二天
  • 仿天猫超市收藏抛物线动画工具库
  • 记录一下第一次使用npm
  • 记一次和乔布斯合作最难忘的经历
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 主流的CSS水平和垂直居中技术大全
  • 走向全栈之MongoDB的使用
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #Java第九次作业--输入输出流和文件操作
  • #QT(TCP网络编程-服务端)
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (待修改)PyG安装步骤
  • (多级缓存)多级缓存
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (函数)颠倒字符串顺序(C语言)
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (十六)视图变换 正交投影 透视投影
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转载)hibernate缓存
  • ***利用Ms05002溢出找“肉鸡
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .net 无限分类
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化