【RAG实践】基于 LlamaIndex 和Qwen1.5搭建基于本地知识库的问答机器人

什么是RAG

LLM会产生误导性的 “幻觉”,依赖的信息可能过时,处理特定知识时效率不高,缺乏专业领域的深度洞察,同时在推理能力上也有所欠缺。

正是在这样的背景下,检索增强生成技术(Retrieval-Augmented Generation,RAG)应时而生,成为 AI 时代的一大趋势。

RAG 通过在语言模型生成答案之前,先从广泛的文档数据库中检索相关信息,然后利用这些信息来引导生成过程,极大地提升了内容的准确性和相关性。RAG 有效地缓解了幻觉问题,提高了知识更新的速度,并增强了内容生成的可追溯性,使得大型语言模型在实际应用中变得更加实用和可信。

一个典型的RAG的例子:

图片

这里面主要包括包括三个基本步骤:

  1. 索引 — 将文档库分割成较短的 Chunk,并通过编码器构建向量索引。

2. 检索 — 根据问题和 chunks 的相似度检索相关文档片段。

3. 生成 — 以检索到的上下文为条件,生成问题的回答。

通义千问1.5

Qwen1.5版本年前开源了包括0.5B、1.8B、4B、7B、14B和72B在内的六种大小的基础和聊天模型,同时,也开源了量化模型。不仅提供了Int4和Int8的GPTQ模型,还有AWQ模型,以及GGUF量化模型。为了提升开发者体验,Qwen1.5的代码合并到Hugging Face Transformers中,开发者现在可以直接使用transformers>=4.37.0 而无需 trust_remote_code。

与之前的版本相比,Qwen1.5显著提升了聊天模型与人类偏好的一致性,并且改善了它们的多语言能力。所有模型提供了统一的上下文长度支持,支持32K上下文。还有,基础语言模型的质量也有所小幅改进。

Qwen1.5全系列统一具备强大的链接外部系统能力(agent/RAG/Tool-use/Code-interpreter)。

正因为Qwen1.5作为中文LLM率先合入了Transformers,我们也可以使用LLaMaIndex的原生HuggingFaceLLM来加载模型。

LLaMaIndex

LlamaIndex 是一个基于 LLM 的应用程序的数据框架,受益于上下文增强。 这种LLM系统被称为RAG系统,代表“检索增强生成”。LlamaIndex 提供了必要的抽象,可以更轻松地摄取、构建和访问私有或特定领域的数据,以便将这些数据安全可靠地注入 LLM 中,以实现更准确的文本生成。

图片

GTE文本向量

文本表示是自然语言处理(NLP)领域的核心问题, 其在很多NLP、信息检索的下游任务中发挥着非常重要的作用。近几年, 随着深度学习的发展,尤其是预训练语言模型的出现极大的推动了文本表示技术的效果, 基于预训练语言模型的文本表示模型在学术研究数据、工业实际应用中都明显优于传统的基于统计模型或者浅层神经网络的文本表示模型。这里, 我们主要关注基于预训练语言模型的文本表示。

图片

GTE-zh模型使用retromae初始化训练模型,之后利用两阶段训练方法训练模型:第一阶段利用大规模弱弱监督文本对数据训练模型,第二阶段利用高质量精标文本对数据以及挖掘的难负样本数据训练模型。

技术交流群

前沿技术资讯、算法交流、求职内推、算法竞赛、面试交流(校招、社招、实习)等、与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企开发者互动交流~

我们建了大模型算法岗技术与面试交流群, 想要进交流群、需要源码&资料、提升技术的同学,可以直接加微信号:mlc2060。加的时候备注一下:研究方向 +学校/公司+CSDN,即可。然后就可以拉你进群了。

方式①、微信搜索公众号:机器学习社区,后台回复:加群
方式②、添加微信号:mlc2060,备注:技术交流

最佳实践

环境配置与安装

  1. python 3.10及以上版本

  2. pytorch 1.12及以上版本,推荐2.0及以上版本

  3. 建议使用CUDA 11.4及以上

本文主要演示的模型推理代码可在魔搭社区免费实例PAI-DSW的配置下运行(显存24G) :

第一步:点击模型右侧Notebook快速开发按钮,选择GPU环境

图片

第二步:新建Notebook

图片

安装依赖库

!pip install llama-index llama-index-llms-huggingface ipywidgets
!pip install transformers -U
import logging
import syslogging.basicConfig(stream=sys.stdout, level=logging.INFO)
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))from IPython.display import Markdown, display
import torch
from llama_index.llms.huggingface import HuggingFaceLLM
from llama_index.core.prompts import PromptTemplate
from modelscope import snapshot_download
from llama_index.core.base.embeddings.base import BaseEmbedding, Embedding
from abc import ABC
from typing import Any, List, Optional, Dict, cast
from llama_index.core import (VectorStoreIndex,ServiceContext,set_global_service_context,SimpleDirectoryReader,
)

加载大语言模型

因为Qwen本次支持了Transformers,使用HuggingFaceLLM加载模型,模型为(Qwen1.5-4B-Chat)

# Model names 
qwen2_4B_CHAT = "qwen/Qwen1.5-4B-Chat"selected_model = snapshot_download(qwen2_4B_CHAT)SYSTEM_PROMPT = """You are a helpful AI assistant.
"""query_wrapper_prompt = PromptTemplate("[INST]<<SYS>>\n" + SYSTEM_PROMPT + "<</SYS>>\n\n{query_str}[/INST] "
)llm = HuggingFaceLLM(context_window=4096,max_new_tokens=2048,generate_kwargs={"temperature": 0.0, "do_sample": False},query_wrapper_prompt=query_wrapper_prompt,tokenizer_name=selected_model,model_name=selected_model,device_map="auto",# change these settings below depending on your GPUmodel_kwargs={"torch_dtype": torch.float16},
)

加载数据:导入测试数据

!mkdir -p 'data/xianjiaoda/'
!wget 'https://modelscope.oss-cn-beijing.aliyuncs.com/resource/rag/xianjiaoda.md' -O 'data/xianjiaoda/xianjiaoda.md'
documents = SimpleDirectoryReader("/mnt/workspace/data/xianjiaoda/").load_data()
documents

构建Embedding类

加载GTE模型,使用GTE模型构造Embedding类

embedding_model = "iic/nlp_gte_sentence-embedding_chinese-base"
class ModelScopeEmbeddings4LlamaIndex(BaseEmbedding, ABC):embed: Any = Nonemodel_id: str = "iic/nlp_gte_sentence-embedding_chinese-base"def __init__(self,model_id: str,**kwargs: Any,) -> None:super().__init__(**kwargs)try:from modelscope.models import Modelfrom modelscope.pipelines import pipelinefrom modelscope.utils.constant import Tasks# 使用modelscope的embedding模型(包含下载)self.embed = pipeline(Tasks.sentence_embedding, model=self.model_id)except ImportError as e:raise ValueError("Could not import some python packages." "Please install it with `pip install modelscope`.") from edef _get_query_embedding(self, query: str) -> List[float]:text = query.replace("\n", " ")inputs = {"source_sentence": [text]}return self.embed(input=inputs)['text_embedding'][0].tolist()def _get_text_embedding(self, text: str) -> List[float]:text = text.replace("\n", " ")inputs = {"source_sentence": [text]}return self.embed(input=inputs)['text_embedding'][0].tolist()def _get_text_embeddings(self, texts: List[str]) -> List[List[float]]:texts = list(map(lambda x: x.replace("\n", " "), texts))inputs = {"source_sentence": texts}return self.embed(input=inputs)['text_embedding'].tolist()async def _aget_query_embedding(self, query: str) -> List[float]:return self._get_query_embedding(query)

建设索引

加载数据后,基于文档对象列表(或节点列表),建设他们的index,就可以方便的检索他们。

embeddings = ModelScopeEmbeddings4LlamaIndex(model_id=embedding_model)
service_context = ServiceContext.from_defaults(embed_model=embeddings, llm=llm)
set_global_service_context(service_context)index = VectorStoreIndex.from_documents(documents)

查询和问答

搭建基于本地知识库的问答引擎

query_engine = index.as_query_engine()
response = query_engine.query("西安交大是由哪几个学校合并的?")
print(response)

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

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

相关文章

Transformer的前世今生 day06(Self-Attention和RNN、LSTM的区别

Self-Attention和RNN、LSTM的区别 RNN&#xff08;循环神经网络&#xff09; RNN&#xff0c;当前的输出 o t o_t ot​取决于上一个的输出 o t − 1 o_{t-1} ot−1​作为当前的输入 x t − 1 x_{t-1} xt−1​和当前状态下前一时间的隐变量 h t h_t ht​&#xff0c;隐变量和隐…

数据分析-Pandas多维数据平行坐标可视化

数据分析-Pandas多维数据平行坐标可视化 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表…

蓝桥杯刷题(十三)

1.煤球数目 代码 cnt ans 0 start 1 a [] while cnt<100:ansstartstart 1t ansstartcnt1a.append(ans) print(sum(a))2.奖券数目 代码 def f(x)->bool:while x:if x%104:return Falsex//10return True ans 0 for i in range(10000,100000):if f(i):ans1 print(a…

26 OpenCV 查找边缘

文章目录 findContours 发现边缘drawContours 绘制边缘大致流程示例 findContours 发现边缘 cv::findContours( InputOutputArray binImg, // 输入图像&#xff0c;非0的像素被看成1,0的像素值保持不变&#xff0c;8-bitOutputArrayOfArrays contours,// 全部发现的轮廓对象…

libVLC 轨道信息

libVLC是一个流行的开源多媒体播放器框架&#xff0c;它提供了丰富的 API 用于开发视频播放相关的应用程序。获取轨道信息&#xff0c;是指获取当前媒体文件的音频、视频或字幕等轨道信息。 常见的视频文件一般都有音频和视频、特殊的会带有字幕文件。 媒体轨道信息结构存放在…

ARM/Linux嵌入式面经(八):OPPO三面

OPPO三面 一面(4.2,20min) # 1.自我介绍# 2.三个项目,问的很详细后面专门会出一版怎么做自我介绍,以及项目怎么写,会怎么问,你该怎么回答。 3.SPI是什么?有几条线?几种模式? SPI协议简介 板卡内不同芯片间通讯最常用的三种串行协议:UART、I2C、SPI,之前写过串口协…

国际数字影像产业园:专注于数字影像领域的成都数字产业园

国际数字影像产业园&#xff08;数媒大厦&#xff09;&#xff0c;作为一个专注于数字影像产业的成都数字产业园&#xff0c;其服务优势体现在三大生态服务体系&#xff1a;公共服务、公务服务、产业服务。这三大服务体系不仅共享化、数字化、产业化&#xff0c;更致力于为企业…

24.两数相加

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …

【Spring Cloud】微服务注册中心的工作原理

SueWakeup 个人主页&#xff1a;SueWakeup 系列专栏&#xff1a;学习技术栈 个性签名&#xff1a;人生乏味啊&#xff0c;我欲令之光怪陆离 本文封面由 凯楠&#x1f4f7; 友情提供&#xff01; 目录 前言 1. 注册中心的主要作用 2. 常见的注册中心 3. Nacos 服务注册和发…

面试真经(运维工程师)

1.熟悉的排序算法有哪些&#xff0c;它们的时间空间复杂度如何? 排序算法主要分为内部排序和外部排序。内部排序指的是数据记录在内存中进行排序&#xff0c;而外部排序则适用于排序的数据量很大&#xff0c;一次不能容纳全部排序记录的情况&#xff0c;需要在排序过程中访问…

关于VMware Workstation Pro无法与Windows互相进行复制粘贴的解决方案

说明&#xff1a;要实现Windows在wmware虚拟机上实现复制粘贴需要在虚拟机上下载 VMware Tools 工具。 1.查看虚拟机是否下载了VMware Tools工具。&#xff08;下载了vMware Tools 会变成灰色的&#xff09; 2.要是成功安装的话&#xff0c;你在去改一下这里。 设置完到这里理…

【面试题】HashMap为什么可以插入null而Hashtable就不可以(源码分析)

首先hashmap可以插入null值&#xff0c;但是hashtable和hashcurrentHashmap是不支持的&#xff1b;这是因为在 hashmap对插入key为null进行了特殊处理&#xff0c;当插入的值为null的时候会将哈希值设置为0 但是hashtable会直接抛出异常&#xff1a; 并且hashmap是线程不…

流畅的 Python 第二版(GPT 重译)(七)

第十三章&#xff1a;接口、协议和 ABCs 针对接口编程&#xff0c;而不是实现。 Gamma、Helm、Johnson、Vlissides&#xff0c;《面向对象设计的第一原则》 面向对象编程关乎接口。在 Python 中理解类型的最佳方法是了解它提供的方法——即其接口——如 “类型由支持的操作定义…

openssl3.2 - exp - openssl speed test

文章目录 openssl3.2 - exp - openssl speed test概述笔记表面上能列出的算法集合没列出的算法, 有的也支持不支持的算法的例子直接提示算法不支持算法的属性找不到到底哪些算法才是可以测试的算法?那看看哪些算法是支持的?包含支持的算法的名称数组在算法失败的提示处, 将支…

【一起学Rust | 基础篇】rust线程与并发

文章目录 前言一、创建线程二、mpsc多生产者单消费者模型1.创建一个简单的模型2.分批发送数据3. 使用clone来产生多个生产者 三、共享状态&#xff1a;互斥锁1. 创建一个简单的锁2. 使用互斥锁解决引用问题 前言 并发编程&#xff08;Concurrent programming&#xff09;&#…

未来已来?国内10家AI大模型盘点(附体验网址)

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 1、阿里云——通义千问2、科大讯飞——星火大模…

Unity类银河恶魔城学习记录11-3 p105 Inventory UI源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili UI_itemSlot.cs using System.Collections; using System.Collections.Gen…

从初学者到专家:Java的Lambda表达式完整指南

一.Lambda的概念 概念&#xff1a;Lambda表达式是Java 8引入的一项重要功能&#xff0c;它允许我们以更简洁和灵活的方式编写代码。可以把Lambda表达式看作是一种更方便的匿名函数&#xff0c;可以像数据一样传递和使用。 使用Lambda表达式可以让我们写出更短、更易读的代码。…

C++ —— 内存管理

目录 1. C内存分布 2. C 内存管理方式 2.1 new 和 delete 操作内置类型 2.2 new 和 delete 操作自定义类型 3. operator new与operator delete函数 4. new和delete的实现原理 5. malloc/free 和 new/delete 的区别 1. C内存分布 首先看一段代码&#xff1a; int globalV…

用Python的turtle库绘制皮卡丘

turtle库的简介 turtle(海龟)库是turtle绘图体系的python实现&#xff0c;turtle库是一种标准库&#xff0c;是python自带的。 turtle(海龟)是一种真实的存在&#xff0c;有一个海龟在窗口的正中心&#xff0c;在画布上游走&#xff0c;走过的轨迹形成了绘制的图形&#xff0…