RAG:AI大模型联合向量数据库和 Llama-index,助力检索增强生成技术

本文涉及的产品
NLP 自学习平台,3个模型定制额度 1个月
NLP自然语言处理_基础版,每接口每天50万次
NLP自然语言处理_高级版,每接口累计50万次
简介: RAG:AI大模型联合向量数据库和 Llama-index,助力检索增强生成技术

RAG:AI大模型联合向量数据库和 Llama-index,助力检索增强生成技术

在大模型爆发的时代,快速准确地从大量数据中检索出有价值的信息变得至关重要。检索增强生成(RAG)技术,结合了传统的信息检索和最新的大语言模型(LLM),不仅能够回答复杂的查询,还能在此基础上生成信息丰富的内容。

RAG 技术的核心在于其能够将大型语言模型的生成能力与特定数据源的检索相结合。这意味着,当模型面对用户提出的问题时,它不仅依赖于自身训练时的知识,还可以实时地从外部数据源中检索相关信息,以此增强回答的准确性和丰富性。这种方法对于处理最新信息特别有效,能够有效弥补传统模型在时效性方面的不足。

这里我们将基于大模型、Milvus 向量数据库、LlamaIndex 大模型应用框架,与大家一起完成 RAG 系统的搭建。本文将以 Yuan2.0 最新发布的 Februa 模型为例进行测试验证,用更小规模的模型达到更好的效果。

1.RAG 系统架构

RAG(检索增强生成) 就是通过检索获取相关的知识并将其融入 Prompt,让大模型能够参考相应的知识从而给出合理回答。因此,可以将 RAG 的核心理解为 “检索 + 生成”,前者主要是利用向量数据库的高效存储和检索能力,召回目标知识;后者则是利用大模型和 Prompt 工程,将召回的知识合理利用,生成目标答案。

从 RAG 系统的运行流程我们可以看到,整个 RAG 系统可以分解为三个核心部件:

  • 向量数据库:用来存放向量化之后的知识库,并提供向量检索能力,为 RAG 系统实现对知识的初步检索。这里我们采用 Milvus 向量数据库来实现知识的存储和初筛。它通常被用来存储、索引和管理由深度神经网络和其他机器学习(ML)模型生成的大规模嵌入向量。作为一个专门设计用于处理输入向量查询的数据库,Milvus 能够处理万亿级别的向量索引。与现有的关系型数据库主要处理遵循预定义模式的结构化数据不同,Milvus 从底层设计用于处理从非结构化数据转换而来的嵌入向量。
  • 语言大模型(LLM):用来实现基于检索到的知识的推理和答案生成。这里我们将采用浪潮最新发布的 Yuan2.0 大模型来实现答案生成。从官方公布的资料来看,Yuan2.0 是在 Yuan1.0 的基础上,利用更多样的高质量预训练数据和指令微调数据集,令模型在语义、数学、推理、代码、知识等不同方面具备更强的理解能力。Yuan2.0 包含了 2B、51B、102B 不同参数量的系列模型。根据官方公布的资料显示,今年 3 月最新发布的 Yuan2-2B-Februa 在数学推理、代码生成等任务上的精度均取得了明显提升。为了部署方便,我们将采用 Yuan2-2B-Februa 来构建 RAG 系统的 LLM 模块。关于 Yuan2.0 模型的详细介绍请参考:Yuan2.0 Github

  • 问答推理框架:问答推理框架主要用来实现 RAG 系统的问答逻辑。它接收用户的提问输入,并根据输入向向量数据库发起索引请求,将得到的索引结果与问题结合,形成新的提示词(prompt),并将提示词提交给 LLM,最后将 LLM 生成的结果返回给用户。这里我们将采用 LlamaIndex 工具来实现这个框架。其主要由 3 部分组成:

    • 数据连接。首先将数据能读取进来,这样才能挖掘。
    • 索引构建。要查询外部数据,就必须先构建可以查询的索引,LlamdaIndex 将数据存储在 Node 中,并基于 Node 构建索引。索引类型包括向量索引、列表索引、树形索引等;
    • 查询接口。通过这些接口用户可以先基于索引进行检索,再将检索结果和之前的输入 Prompt 进行组合形成新的扩充 Prompt,对话大模型并拿到结果进行解析。

2.部署教程

2.1 流程图

以 Yuan2-2B-Februa 大模型为例,RAG 实践流程图如下所示:

  • Yuan2.0-2B 大模型 RAG 实践包括以下步骤:
    • Step 1: 向量数据库的安装,以及知识的填充;详细安装过程参见后续章节;
    • Step 2:Llama_index 的安装;详细安装过程参见后续章节;
    • Step 3:Llama_index 中设置 data_loader 模块,可以直接从向量数据库中查询;
    • Step 4:根据用户输入进行向量检索,将检索结果与 Input 合并,形成新的 prompt;
    • Step 5:加载 Yuan2.0-2B 大模型;合并后的 prompt 作为输入,传递给大模型,大模型将结果输出返回;

2.2 向量数据库安装以及知识填充

向量数据库安装步骤如下:

#Create Milvus file
mkdir -p /home/$USER/milvus/conf
cd /home/$USER/milvus/conf
wget https://raw.githubusercontent.com/milvus-io/milvus/v0.8.0/core/conf/demo/server_config.yaml
wget https://raw.githubusercontent.com/milvus-io/milvus/v0.8.0/core/conf/demo/log_config.conf
#Start Milvus
docker run -d --name milvus_cpu \
-p 19530:19530 \
-p 19121:19121 \
-p 9091:9091 \
-v /home/$USER/milvus/db:/var/lib/milvus/db \
-v /home/$USER/milvus/conf:/var/lib/milvus/conf \
-v /home/$USER/milvus/logs:/var/lib/milvus/logs \
-v /home/$USER/milvus/wal:/var/lib/milvus/wal \
milvusdb/milvus:0.8.0-cpu-d041520-464400
  • 这里我们以 txt 文本为例,演示如何将知识库导入到数据库中。在任意目录下新建一个 python 脚本 milvus.py,输入以下代码:
from pymilvus import (
    connections,
    utility,
    FieldSchema, CollectionSchema, DataType,
    Collection,
)
from llama_index.embeddings import HuggingFaceEmbedding
fmt = "\n=== {:30} ===\n"
#1. connect to Milvus
print(fmt.format("start connecting to Milvus"))
connections.connect("default", host="localhost", port="19530")
#2. define collection
fields = [
   FieldSchema("pk", DataType.INT64, is_primary=True, auto_id=True),
   FieldSchema("vector", DataType.FLOAT_VECTOR, dim=768),]
schema = CollectionSchema(fields, "hello_milvus is the simplest demo to introduce the APIs")
print(fmt.format("Create collection `hello_milvus`"))
hello_milvus = Collection("hello_milvus", schema, consistency_level="Strong")
#3. insert data
chunk_list = []
print("Creat embedding model...")
embed_model = HuggingFaceEmbedding(model_name="BAAI/bge-small-zh-v1.5",trust_remote_code=True)
with open('knowledge.txt', 'r') as file:
    line = file.readline()
    while line:
        # Generate embeddings using encoder from HuggingFace.
        embeddings = embed_model.get_text_embedding(line)
        chunk_list.append(embeddings)
        line = file.readline()
insert_result = hello_milvus.insert(chunk_list)
hello_milvus.flush()
#create index
index = {
    "index_type": "AUTOINDEX",
    "metric_type": "COSINE",
}
hello_milvus.create_index("vector", index)

上述代码首先导入 python 连接 milvus 所需的库,然后通过 connections.connect("default", host="localhost", port="19530") 指定使用本地的 19530 端口建立数据库连接。其中 knowledge.txt 就是我们的知识库内容,这个文件放在与 milvus.py 脚本相同的目录下。如果用户的知识库在其他路径存放,修改 with open('knowledge.txt', 'r') 中的路径即可。

knowledge.txt 的初始样例中每行代表一条知识。其中一条数据样例如下,稍后将基于这条知识进行实验验证。

广州大学(Guangzhou University),简称广大(GU),是由广东省广州市人民政府举办的全日制普通高等学校,实行省市共建、以市为主的办学体制,是国家“111计划”建设高校、广东省和广州市高水平大学重点建设高校。广州大学的办学历史可以追溯到1927年创办的私立广州大学;1951年并入华南联合大学;1983年筹备复办,1984年定名为广州大学;2000年7月,经教育部批准,与广州教育学院(1953年创办)、广州师范学院(1958年创办)、华南建设学院西院(1984年创办)、广州高等师范专科学校(1985年创办)合并组建成立新的广州大学。

2.3 Llama_index 安装以及设置安装 Llama-index1

##在线安装
pip install llama-index

设置 data_loader 加载,从 Milvus 中获取知识, 具体源码可参考 yuan.py 文件。

 from llama_index import download_loader
import os
MilvusReader = download_loader("MilvusReader")
reader = MilvusReader(
    host="localhost", port=19530, user="<user>", password="<password>", use_secure=False
)
#the query_vector is an embedding representation of your query_vector
#Example query vector:
#query_vector=[0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3]
query_vector=[n1, n2, n3, ...]
documents = reader.load_data(
    query_vector=query_vector,
    collection_name="demo",
    limit=5
)

2.4 Prompt 合并

text_qa_template=PromptTemplate(
    ("背景:{context_str}"
    "问题: {query_str}\n")
)

说明:

  1. context_str 是知识库中查询到的结果;
  2. query_str 为用户输入的问题;

具体情况如下:1

在本实例中,
query_str具体内容是:介绍一下广州大学

context_str具体内容是:file_path: data\***.txt

广州大学(Guangzhou University),简称广大(GU),是由广东省广州市人民政府举办的全日制普通高等学校,实行省市共建、以市为主的办学体制,是国家“111计划”建设高校、广东省和广州市高水平大学重点建设高校。广州大学的办学历史可以追溯到1927年创办的私立广州大学;1951年并入华南联合大学;1983年筹备复办,1984年定名为广州大学;2000年7月,经教育部批准,与广州教育学院(1953年创办)、广州师范学院(1958年创办)、华南建设学院西院(1984年创办)、广州高等师范专科学校(1985年创办)合并组建成立新的广州大学。

3.5 Yuan 大模型下载以及推理试用安装

Yuan2.0 模型是浪潮信息发布的新一代基础语言大模型。我们开源了全部的 3 个模型:Yuan2.0-102B、Yuan2.0-51B、Yuan2.0-2B。提供预训练、微调、推理服务的相关脚本,以供研发人员做进一步开发。Yuan2.0 是在 Yuan1.0 的基础上,利用更多样的高质量预训练数据和指令微调数据集,令模型在语义、数学、推理、代码、知识等不同方面具备更强的理解能力。

提供了 Yuan2.0 的模型文件,可以通过以下链接进行下载:

更多内容见:https://modelscope.cn/headlines/article/373

运行以下代码可以进行简单的推理效果试用:

import torch, transformers
import sys, os
sys.path.append(
    os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir)))
from transformers import AutoModelForCausalLM,AutoTokenizer,LlamaTokenizer
print("Creat tokenizer...")
tokenizer = LlamaTokenizer.from_pretrained('IEITYuan/Yuan2-2B-Februa-hf', add_eos_token=False, add_bos_token=False, eos_token='<eod>')
tokenizer.add_tokens(['<sep>', '<pad>', '<mask>', '<predict>', '<FIM_SUFFIX>', '<FIM_PREFIX>', '<FIM_MIDDLE>','<commit_before>','<commit_msg>','<commit_after>','<jupyter_start>','<jupyter_text>','<jupyter_code>','<jupyter_output>','<empty_output>'], special_tokens=True)
print("Creat model...")
model = AutoModelForCausalLM.from_pretrained('IEITYuan/Yuan2-2B-Februa-hf', device_map='auto', torch_dtype=torch.bfloat16, trust_remote_code=True)
inputs = tokenizer("请问目前最先进的机器学习算法有哪些?", return_tensors="pt")["input_ids"].to("cuda:0")
outputs = model.generate(inputs,do_sample=False,max_length=100)
print(tokenizer.decode(outputs[0]))

3.案例测试

利用 Yuan2.0 大模型,联合向量数据和 Llama_index,对比用户同一个问题的输出结果,验证方案的可行性。

用户输入问题:"介绍一下广州大学",使用检索增强生成技术之前的模型回答效果,该结果可以直接使用 Yuan2-2B-Februa 模型进行推理复现:

广州大学是一所位于中国广东省广州市的本科高校,创建于1980年。学校以“南国情怀、卓越创新”为校训,是一所以工科为主,工学、理学、管理学、法学、文学、教育学等学科门类齐全的综合性大学。目前设有14个学院和26个研究院所,拥有全日制本科生近3.5万名,硕士、博士研究生超过7万人。校园环境优美,设施完善,是全国文明单位和国家绿化先进集体。

使用检索增强生成技术之后的模型回答效果,运行完整代码,可以复现该结果:

广州大学是一所位于中国广东省广州市的综合性大学,是广东省重点建设高校之一,也是国家“111计划”建设的高校之一。它于1927年由原国立广东法商学院在广州创立,是中国第一所独立设立的现代高等教育机构之一。学校的前身是成立于1927年的广州大学公学,发展至今已成为一所具有悠久历史的研究型大学。学校占地约1880亩,拥有现代化的教学楼、实验楼和图书馆等设施,同时注重学生的全面发展和社会实践能力培养。

对比发现:添加知识库之后,大模型的回答学到了 “国家“111 计划” 建设的高校“的新知识。

4.总结

利用 Yuan 大模型、向量数据库和 LlamaIndex 助力大模型检索增强生成技术,为 NLP 领域开辟了一个可能性领域。这个管道不仅可以理解和生成文本,而且还利用庞大的信息数据库来增强其响应,使其在聊天机器人、推荐系统等各种应用程序中具有难以置信的强大功能。

然而,旅程并没有就此结束。NLP 的世界正在迅速发展,保持最新趋势和技术的更新至关重要。这里讨论的实现是进入更广泛、更复杂的语言理解和生成世界的垫脚石。不断试验,不断学习,最重要的是不断创新。

5. 附完整代码

完整代码文件 yuan.py 内容如下:

from llama_index import download_loader
import logging
import sys
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
from llama_index.embeddings import HuggingFaceEmbedding
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))
from llama_index import VectorStoreIndex, SimpleDirectoryReader, ServiceContext
from llama_index.llms import HuggingFaceLLM
from llama_index.prompts import PromptTemplate
query = "介绍一下广州大学"
yuan_path = "/workspace/yuan_2/Yuan2-2B-Februa-hf"
print("Yuan2-2B-Februa Creat tokenizer...")
tokenizer = AutoTokenizer.from_pretrained(yuan_path, add_eos_token=False, add_bos_token=False, eos_token='<eod>')
tokenizer.add_tokens(['<sep>', '<pad>', '<mask>', '<predict>', '<FIM_SUFFIX>', '<FIM_PREFIX>', '<FIM_MIDDLE>','<commit_before>','<commit_msg>','<commit_after>','<jupyter_start>','<jupyter_text>','<jupyter_code>','<jupyter_output>','<empty_output>'], special_tokens=True)
print("Yuan2-2B-Februa Creat model...")
model = AutoModelForCausalLM.from_pretrained(yuan_path, torch_dtype=torch.bfloat16, trust_remote_code=True)
device_map = torch.cuda.current_device() if torch.cuda.is_available() else torch.device('cpu')
model = model.to(device_map)
# model = model.to("cpu")
llm = HuggingFaceLLM(
    # context_window=2048,
    max_new_tokens=1024,
    generate_kwargs={"temperature": 0.25, "do_sample": False, "repetition_penalty": 1.2, "max_length": 2048},
    # query_wrapper_prompt=query_wrapper_prompt,
    tokenizer=tokenizer,
    model=model,
    # tokenizer_name=yuan_path,
    # model_name=yuan_path,
    device_map="auto",
    # tokenizer_kwargs={"max_length": 2048},
    # uncomment this if using CUDA to reduce memory usage
    model_kwargs={"torch_dtype": torch.float16, "trust_remote_code":True}
)
print("Creat embedding model...")
embed_model = HuggingFaceEmbedding(model_name="BAAI/bge-small-zh-v1.5",trust_remote_code=True)
# load documents
MilvusReader = download_loader("MilvusReader")
reader = MilvusReader(
    host="localhost", port=19530, user="<user>", password="<password>", use_secure=False
)
# Example query vector:
documents = reader.load_data(
    query_vector=embed_model.get_text_embedding(query),
    collection_name="demo",
    limit=5
)
service_context = ServiceContext.from_defaults(llm=llm, embed_model=embed_model)
index = VectorStoreIndex.from_documents(
    documents, service_context=service_context, show_progress=True
)
# define prompts that are used in llama-index, {query_str} is user's question,{context_str} is content queried by milvus
query_engine = index.as_query_engine(**{"text_qa_template":PromptTemplate(
    ("背景:{context_str}"
    "问题: {query_str}\n")
)})
response = query_engine.query(query)
print(response)

更多优质内容请关注公号:汀丶人工智能;会提供一些相关的资源和优质文章,免费获取阅读。

相关实践学习
阿里云百炼xAnalyticDB PostgreSQL构建AIGC应用
通过该实验体验在阿里云百炼中构建企业专属知识库构建及应用全流程。同时体验使用ADB-PG向量检索引擎提供专属安全存储,保障企业数据隐私安全。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
|
1月前
|
存储 人工智能 Cloud Native
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
在9月20日2024云栖大会上,阿里云智能集团副总裁,数据库产品事业部负责人,ACM、CCF、IEEE会士(Fellow)李飞飞发表《从数据到智能:Data+AI驱动的云原生数据库》主题演讲。他表示,数据是生成式AI的核心资产,大模型时代的数据管理系统需具备多模处理和实时分析能力。阿里云瑶池将数据+AI全面融合,构建一站式多模数据管理平台,以数据驱动决策与创新,为用户提供像“搭积木”一样易用、好用、高可用的使用体验。
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
|
9天前
|
人工智能 安全 测试技术
EXAONE 3.5:LG 推出的开源 AI 模型,采用 RAG 和多步推理能力降低模型的幻觉问题
EXAONE 3.5 是 LG AI 研究院推出的开源 AI 模型,擅长长文本处理,能够有效降低模型幻觉问题。该模型提供 24 亿、78 亿和 320 亿参数的三个版本,支持多步推理和检索增强生成技术,适用于多种应用场景。
56 9
EXAONE 3.5:LG 推出的开源 AI 模型,采用 RAG 和多步推理能力降低模型的幻觉问题
|
11天前
|
机器学习/深度学习 人工智能
SNOOPI:创新 AI 文本到图像生成框架,提升单步扩散模型的效率和性能
SNOOPI是一个创新的AI文本到图像生成框架,通过增强单步扩散模型的指导,显著提升模型性能和控制力。该框架包括PG-SB和NASA两种技术,分别用于增强训练稳定性和整合负面提示。SNOOPI在多个评估指标上超越基线模型,尤其在HPSv2得分达到31.08,成为单步扩散模型的新标杆。
52 10
SNOOPI:创新 AI 文本到图像生成框架,提升单步扩散模型的效率和性能
|
11天前
|
人工智能 搜索推荐 开发者
Aurora:xAI 为 Grok AI 推出新的图像生成模型,xAI Premium 用户可无限制访问
Aurora是xAI为Grok AI助手推出的新图像生成模型,专注于生成高逼真度的图像,特别是在人物和风景图像方面。该模型支持文本到图像的生成,并能处理包括公共人物和版权形象在内的多种图像生成请求。Aurora的可用性因用户等级而异,免费用户每天能生成三张图像,而Premium用户则可享受无限制访问。
52 11
Aurora:xAI 为 Grok AI 推出新的图像生成模型,xAI Premium 用户可无限制访问
|
15天前
|
人工智能 编解码 网络架构
GenCast:谷歌DeepMind推出的AI气象预测模型
GenCast是由谷歌DeepMind推出的革命性AI气象预测模型,基于扩散模型技术,提供长达15天的全球天气预报。该模型在97.2%的预测任务中超越了全球顶尖的中期天气预报系统ENS,尤其在极端天气事件的预测上表现突出。GenCast能在8分钟内生成预报,显著提高预测效率,并且已经开源,包括代码和模型权重,支持更广泛的天气预报社区和研究。
107 14
GenCast:谷歌DeepMind推出的AI气象预测模型
|
12天前
|
存储 人工智能 PyTorch
【AI系统】模型转换流程
本文详细介绍了AI模型在不同框架间的转换方法,包括直接转换和规范式转换两种方式。直接转换涉及从源框架直接生成目标框架的模型文件,而规范式转换则通过一个中间标准格式(如ONNX)作为桥梁,实现模型的跨框架迁移。文中还提供了具体的转换流程和技术细节,以及模型转换工具的概览,帮助用户解决训练环境与部署环境不匹配的问题。
31 5
【AI系统】模型转换流程
|
16天前
|
机器学习/深度学习 存储 人工智能
EfficientTAM:Meta AI推出的视频对象分割和跟踪模型
EfficientTAM是Meta AI推出的轻量级视频对象分割和跟踪模型,旨在解决SAM 2模型在移动设备上部署时的高计算复杂度问题。该模型采用非层次化Vision Transformer(ViT)作为图像编码器,并引入高效记忆模块,以降低计算复杂度,同时保持高质量的分割结果。EfficientTAM在多个视频分割基准测试中表现出与SAM 2相当的性能,具有更快的处理速度和更少的参数,特别适用于移动设备上的视频对象分割应用。
36 9
EfficientTAM:Meta AI推出的视频对象分割和跟踪模型
|
12天前
|
机器学习/深度学习 存储 人工智能
【AI系统】模型转换基本介绍
模型转换技术旨在解决深度学习模型在不同框架间的兼容性问题,通过格式转换和图优化,将训练框架生成的模型适配到推理框架中,实现高效部署。这一过程涉及模型格式转换、计算图优化、算子统一及输入输出支持等多个环节,确保模型能在特定硬件上快速、准确地运行。推理引擎作为核心组件,通过优化阶段和运行阶段,实现模型的加载、优化和高效执行。面对不同框架的模型文件格式和网络结构,推理引擎需具备高度的灵活性和兼容性,以支持多样化的应用场景。
33 4
【AI系统】模型转换基本介绍
|
12天前
|
机器学习/深度学习 人工智能 算法
【AI系统】模型压缩基本介绍
模型压缩旨在通过减少存储空间、降低计算量和提高计算效率,降低模型部署成本,同时保持模型性能。主要技术包括模型量化、参数剪枝、知识蒸馏和低秩分解,广泛应用于移动设备、物联网、在线服务系统、大模型及自动驾驶等领域。
49 4
【AI系统】模型压缩基本介绍
|
16天前
|
SQL 存储 人工智能
Vanna:开源 AI 检索生成框架,自动生成精确的 SQL 查询
Vanna 是一个开源的 Python RAG(Retrieval-Augmented Generation)框架,能够基于大型语言模型(LLMs)为数据库生成精确的 SQL 查询。Vanna 支持多种 LLMs、向量数据库和 SQL 数据库,提供高准确性查询,同时确保数据库内容安全私密,不外泄。
83 7
Vanna:开源 AI 检索生成框架,自动生成精确的 SQL 查询

热门文章

最新文章