昇腾 RAG SDK 从入门到实战:技术解析与部署实操

官方文档:简介-RAG SDK-MindSDK7.2.RC1开发文档-昇腾社区

一、RAG 技术原理

什么是RAG?

在大模型技术发展迅速的背景下,大模型也面临很多挑战,例如:知识更新速度慢,时效性差、幻觉严重、准确性不足、缺乏专业领域知识、答案透明度欠缺等。为了解决这些问题,RAG,也就是检索增强生成(Retrieval-Augmented Generation)应运而生,通过 RAG 为大模型接入外界知识库,有效的提升了大模型的准确率、幻觉严重等问题。

个人理解

RAG 做的一个核心的事情就是让 AI "查资料再回答",不用死记硬背还能说准最新信息。

简单来说就是:给 AI 增加了一个"外置知识库"

  • 把 RAG 想象成给 AI 配了一个 "随身文件夹"+"快速搜索引擎"。
  • 这个 "文件夹" 里能存你自己的资料(比如公司文档、专业书籍)或网上的最新信息,AI 不会直接背下所有内容。
  • 当你提问时,AI 先从 "文件夹" 里快速找出和问题相关的资料,再结合自己的理解组织语言,给出带依据的答案。

RAG 范式

  • Naive
    • 最简的 RAG 方式,主要就是索引、检索、生成三部分。
  • Advanced RAG:增加索引前后优化
    • 索引前优化:优化索引结构、查询重写、扩写
    • 索引后优化:检索后精排和上下文压缩
  • Modular RAG:模块化 RAG 有更多的功能和更强的适应性
    • 新模块:路由、预测、混合检索、知识图谱
    • 新模式:通过模块替换和配置来解决不同的问题

主流 RAG 对比

Langchain

Langchain 是目前最热门的开源框架,像 "RAG 积木套装",能灵活组合数据加载、检索、问答等模块,支持多种大模型和数据库。

兼容性强:能对接几乎所有主流大模型、数据库(向量库、MySQL 等)和工具(邮件、API 接口等)。

灵活性高:支持自定义每个环节(比如自己写文本分割规则、调整检索策略),既适合新手快速上手,也能满足复杂场景的定制需求。

RAGFlow

RAGFlow 的一大核心亮点就是支持拖拽组装使用不同的 API,对于刚上手的新手十分的友好。与 LangChain 不同的是 RAGFlow 更侧重于提供"文档深度理解和结构化处理"的解决方案。

强文档处理能力:能自动解析各种格式的文档(PDF、Word、表格、图片里的文字等),还能识别文档里的标题、段落、公式、图表等结构,甚至能提取关键信息(比如人名、日期、条款等),让文档 "更有条理" 地被检索。

轻量化部署:相比一些复杂框架,它更注重 "开箱即用",提供了可视化界面和简单的 API,方便非技术人员快速搭建基于自有文档的问答系统,适合企业内部知识库、客服问答等场景。

其余的主流 RAG 还有很多,例如微软的 graphRAG,更侧重于构建基于图谱的文本索引;还有各大云服务商提供的 RAG 方案:TI-ONE RAG、OpenAI Retrieval、AWS Kendra,这些 RAG 更适合快速落地,不用自己搭底层。

总之,每个不同的 RAG 都有自己侧重的方向,面临具体的业务场景时,还需要具体调研一下哪种 RAG 更合适。

二、RAG SDK 架构和功能

昇腾 RAG SDK 是昇腾推出的知识增强开发套件,基于python开发,可以利用腾NPU加速,提供相关API帮助用户搭建大模型问答系统。

大模型问答示例

  1. 构建知识库
    1. 上传领域文档,加载和切分。
    2. 切分后向量化。
    3. 知识库管理,切分后问题和向量化数据保存到向量数据库和关系数据库。
  2. 在线问答
    1. 配置缓存,加速在线问答。
    2. 使用 Chain 串联 LLM、检索、精排模块。
    3. 数据检索。
    4. 检索后数据精排。
    5. 调用 LLM 进行推理。

RAG SDK功能

昇腾RAG SDK提供了众多的功能,例如:

  • 知识管理 :可通过自定义继承自langchain_community.document_loaders.base.BaseLoader类来实现多种文件格式的加载;同时可对文档进行切割操作。
  • 向量数据库:支持MindFaiss基于Index SDK的python接口,实现昇腾NPU加速的faiss功能;同时支持了Milvus开源向量数据库,封装了相关接口。
  • 向量化重排:RAG SDK可以使用融合算子对Beart类模型进行加速处理。
  • 问答缓存Cache
  • Agentic RAG
  • 估RAGAS

更多详细的内容可以在昇腾 RAG SDK 官方提供的课件内容中观看。

三、安装部署

安装必须依赖

在正式安装部署 RAG 之前,才需要安装下表中所有的依赖包。

依赖地址:社区版资源下载-资源下载中心-昇腾社区商用版资源下载-资源下载中心-昇腾社区

安装前的准备

  • 复制驱动目录,将属主和属组更改为HwHiAiUser。
bash 复制代码
cp -r /usr/local/Ascend/driver /tmp
chown -R HwHiAiUser:HwHiAiUser /tmp/driver
  • 安装 libpq-dev
bash 复制代码
# 安装libpq-dev(psycopg2需要)
apt install -y libpq-dev
# 设置PY_VERSION为python3.11
export PY_VERSION=python3.11
# 添加Python ppa
add-apt-repository -y ppa:deadsnakes/ppa && apt-get update
  • 安装 Python
bash 复制代码
# 安装Python
apt-get install -y --no-install-recommends $PY_VERSION $PY_VERSION-dev $PY_VERSION-distutils $PY_VERSION-venv
# 设置默认的python
ln -sf /usr/bin/$PY_VERSION /usr/bin/python3
ln -sf /usr/bin/$PY_VERSION /usr/bin/python
# 安装pip
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3 get-pip.py
python3 -m pip install --upgrade setuptools

具体操作步骤

  1. 切换用户至HwHiAiUser,并进入"/home/HwHiAiUser"目录。
bash 复制代码
su - HwHiAiUser
cd /home/HwHiAiUser
  1. 安装torch和torch-npu。
bash 复制代码
# for x86,安装torch:
pip3 install torch==2.1.0+cpu  --index-url https://download.pytorch.org/whl/cpu
# for aarch64,安装torch:
pip3 install torch==2.1.0 
# for all,安装torch-npu
pip3 install torch-npu==2.1.0.post12
  1. 安装torchvision-npu
bash 复制代码
# 下载Torchvision Adapter代码,进入插件根目录
git clone https://gitee.com/ascend/vision.git vision_npu
cd vision_npu
git checkout v0.16.0-6.0.0
# 安装依赖库
pip3 install -r requirement.txt
# 配置cann环境变量
source /home/HwHiAiUser/Ascend/ascend-toolkit/set_env.sh
# 编包
python3 setup.py bdist_wheel
# 安装
cd dist
pip3 install torchvision_npu-*.whl
  1. 安装OpenBLAS。
    1. 下载OpenBLAS v0.3.10源码压缩包并解压。
bash 复制代码
wget https://github.com/xianyi/OpenBLAS/archive/v0.3.10.tar.gz -O OpenBLAS-0.3.10.tar.gz
tar -xf OpenBLAS-0.3.10.tar.gz
css 复制代码
2. <font style="color:rgba(0, 0, 0, 0.8);">进入OpenBLAS目录。</font>
bash 复制代码
cd OpenBLAS-0.3.10
css 复制代码
3. <font style="color:rgba(0, 0, 0, 0.8);">编译安装。</font>
bash 复制代码
make FC=gfortran USE_OPENMP=1 -j
# 普通用户需要指定安装路径
make PREFIX=/home/HwHiAiUser/OpenBLAS install
css 复制代码
4. <font style="color:rgba(0, 0, 0, 0.8);">配置库路径的环境变量。</font>
bash 复制代码
vim ~/.bashrc
# 在文件末添加如下信息
export LD_LIBRARY_PATH=/home/HwHiAiUser/OpenBLAS/lib:$LD_LIBRARY_PATH
css 复制代码
5. <font style="color:rgba(0, 0, 0, 0.8);">验证是否安装成功。</font>
bash 复制代码
cat /home/HwHiAiUser/OpenBLAS/lib/cmake/openblas/OpenBLASConfigVersion.cmake | grep 'PACKAGE_VERSION "'

如果正确显示软件的版本信息,则表示安装成功。

  1. 下载faiss源码,构建faiss wheel包并安装。
    1. 下载faiss源码包并解压。
bash 复制代码
# faiss 1.10.0
wget https://github.com/facebookresearch/faiss/archive/v1.10.0.tar.gz 
tar -xf v1.10.0.tar.gz && cd faiss-1.10.0/faiss
css 复制代码
2. <font style="color:rgba(0, 0, 0, 0.8);">创建install_faiss.sh脚本。</font>
bash 复制代码
vi install_faiss.sh
css 复制代码
3. <font style="color:rgba(0, 0, 0, 0.8);">在install_faiss.sh脚本中写入如下内容。</font>
bash 复制代码
export FAISS_INSTALL_PATH=/usr/local/faiss/faiss1.10.0
# faiss安装后可能是${FAISS_INSTALL_PATH}/lib或者${FAISS_INSTALL_PATH}/lib64,与具体操作系统有关
export FAISS_INSTALL_PATH_LIB=${FAISS_INSTALL_PATH}/lib
mkdir -p ${FAISS_INSTALL_PATH} 
sed -i "149 i virtual void search_with_filter (idx_t n, const float *x, idx_t k, float *distances, idx_t *labels, const void *mask = nullptr) const{}" Index.h     
sed -i "49 i template <typename IndexT> IndexIDMapTemplate<IndexT>::IndexIDMapTemplate (IndexT *index, std::vector<idx_t> &ids): index (index), own_fields (false) { this->is_trained = index->is_trained; this->metric_type = index->metric_type; this->verbose = index->verbose; this->d = index->d; id_map = ids; }" IndexIDMap.cpp     
sed -i "30 i explicit IndexIDMapTemplate (IndexT *index, std::vector<idx_t> &ids);" IndexIDMap.h     
sed -i "217 i utils/sorting.h" CMakeLists.txt   
cd .. && cmake -B build . -DFAISS_ENABLE_GPU=OFF -DPython_EXECUTABLE=/usr/bin/python3 -DBUILD_TESTING=OFF -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=${FAISS_INSTALL_PATH}    
make -C build -j faiss    
make -C build -j swigfaiss    
# 如果报错没有wheel,使用pip安装
cd build/faiss/python && python3 setup.py bdist_wheel  
cd ../../.. && make -C build install  
cd build/faiss/python && cp libfaiss_python_callbacks.so ${FAISS_INSTALL_PATH_LIB}/ 
cd dist
# 该操作可能更新numpy到2.x.x版本,需要回退到1.26.4
pip3 install faiss-1.10.0*.whl
css 复制代码
4. <font style="color:rgba(0, 0, 0, 0.8);">按"Esc"键,输入</font>**<font style="color:rgba(0, 0, 0, 0.8);">:wq!</font>**<font style="color:rgba(0, 0, 0, 0.8);">,按"Enter"保存并退出编辑。</font>
bash 复制代码
:wq!
css 复制代码
5. <font style="color:rgba(0, 0, 0, 0.8);">执行</font>**<font style="color:rgba(0, 0, 0, 0.8);">install_faiss.sh</font>**<font style="color:rgba(0, 0, 0, 0.8);">脚本,安装faiss。</font>
bash 复制代码
bash install_faiss.sh
  1. 安装Index SDK。
    1. 增加对软件包的可执行权限。
bash 复制代码
chmod +x Ascend-mindxsdk-mxindex_{version}_linux-{arch}.run
css 复制代码
2. <font style="color:rgba(0, 0, 0, 0.8);">执行如下命令,校验软件包的一致性和完整性。</font>
bash 复制代码
./Ascend-mindxsdk-mxindex_{version}_linux-{arch}.run --check
css 复制代码
3. <font style="color:rgba(0, 0, 0, 0.8);">创建软件包的安装路径。</font>
bash 复制代码
mkdir -p /home/HwHiAiUser/Ascend
css 复制代码
4. <font style="color:rgba(0, 0, 0, 0.8);">安装Index SDK。</font>
bash 复制代码
./Ascend-mindxsdk-mxindex_7.2.RC1_linux-aarch64.run --install --install-path=<安装路径> --platform=<npu_type>

若出现如下回显信息,则表示软件成功安装。

Uncompressing ASCEND MXINDEX RUN PACKAGE 100%

css 复制代码
5. <font style="color:rgba(0, 0, 0, 0.8);">安装完Index SDK后执行Index SDK脚本。</font>
bash 复制代码
cd /mxIndex/ops && ./custom_opp_{arch}.run
  1. 下载并安装ascendfaiss。
    1. 下载源码包并解压
bash 复制代码
wget https://gitee.com/ascend/mindsdk-referenceapps/repository/archive/master.zip 
unzip master.zip && cd mindsdk-referenceapps-master/IndexSDK/faiss-python
css 复制代码
2. <font style="color:rgba(0, 0, 0, 0.8);">创建install_ascendfaiss_sh.sh脚本</font>
bash 复制代码
vi install_ascendfaiss.sh
css 复制代码
3. <font style="color:rgba(0, 0, 0, 0.8);">在install_ascendfaiss.sh脚本中写入如下内容。</font>
bash 复制代码
# 设置以下环境变量
export PY_VERSION=python3.11
export FAISS_INSTALL_PATH=/usr/local/faiss/faiss1.10.0
# faiss安装后可能是${FAISS_INSTALL_PATH}/lib或者${FAISS_INSTALL_PATH}/lib64,与具体操作系统有关
export FAISS_INSTALL_PATH_LIB=${FAISS_INSTALL_PATH}/lib
export INDEXSDK_INSTALL_PATH=/home/HwHiAiUser/Ascend/mxIndex
export PYTHON_HEADER=/usr/include/$PY_VERSION/
export ASCEND_INSTALL_PATH=/home/HwHiAiUser/Ascend/ascend-toolkit/latest
export DRIVER_INSTALL_PATH=/tmp
export OPENBLAS_INSTALL_PATH=/home/HwHiAiUser/OpenBLAS
swig -python -c++ -Doverride= -module swig_ascendfaiss -I${PYTHON_HEADER} -I${FAISS_INSTALL_PATH}/include -I${INDEXSDK_INSTALL_PATH}/include -DSWIGWORDSIZE64 -o swig_ascendfaiss.cpp swig_ascendfaiss.swig 
g++ -std=c++11 -DFINTEGER=int -fopenmp -I/usr/local/include -I${ASCEND_INSTALL_PATH}/include -I${ASCEND_INSTALL_PATH}/runtime/include -I${DRIVER_INSTALL_PATH}/driver/kernel/inc/driver -I${DRIVER_INSTALL_PATH}/driver/kernel/libc_sec/include -fPIC -fstack-protector-all -Wall -Wreturn-type -D_FORTIFY_SOURCE=2 -g -O3 -Wall -Wextra  -I${PYTHON_HEADER} -I/home/HwHiAiUser/.local/lib/$PY_VERSION/site-packages/numpy/core/include -I${FAISS_INSTALL_PATH}/include -I${INDEXSDK_INSTALL_PATH}/include -c swig_ascendfaiss.cpp -o swig_ascendfaiss.o 
g++ -std=c++11 -shared -fopenmp -L${OPENBLAS_INSTALL_PATH}/lib/ -L${ASCEND_INSTALL_PATH}/lib64 -L${ASCEND_INSTALL_PATH}/runtime/lib64 -L${DRIVER_INSTALL_PATH}/driver/lib64 -L${DRIVER_INSTALL_PATH}/driver/lib64/common -L${DRIVER_INSTALL_PATH}/driver/lib64/driver -L${FAISS_INSTALL_PATH_LIB}/ -L${INDEXSDK_INSTALL_PATH}/lib -Wl,-rpath-link=${ASCEND_INSTALL_PATH}/acllib/lib64:${ASCEND_INSTALL_PATH}/runtime/lib64:${DRIVER_INSTALL_PATH}/driver/lib64:${DRIVER_INSTALL_PATH}/driver/lib64/common:${DRIVER_INSTALL_PATH}/driver/lib64/driver -L/usr/local/lib -Wl,-z,relro -Wl,-z,now -Wl,-z,noexecstack -s -o _swig_ascendfaiss.so swig_ascendfaiss.o -L.. -lascendfaiss -lfaiss -lascend_hal -lacl_retr -lascendcl -lc_sec -lopenblas -lacl_op_compiler 
# 如果报错没有build,使用pip安装
python3 -m build 
cd dist && pip3 install ascendfaiss*.whl
export LD_LIBRARY_PATH=${INDEXSDK_INSTALL_PATH}/lib:${FAISS_INSTALL_PATH}/lib:$LD_LIBRARY_PATH
css 复制代码
4. <font style="color:rgba(0, 0, 0, 0.8);">按"Esc"键,输入</font>**<font style="color:rgba(0, 0, 0, 0.8);">:wq!</font>**<font style="color:rgba(0, 0, 0, 0.8);">,按"Enter"保存并退出编辑。</font>
bash 复制代码
:wq!
css 复制代码
5. <font style="color:rgba(0, 0, 0, 0.8);">执行</font>**<font style="color:rgba(0, 0, 0, 0.8);">install_ascendfaiss.sh</font>**<font style="color:rgba(0, 0, 0, 0.8);">脚本,安装</font>**<font style="color:rgba(0, 0, 0, 0.8);">ascendfaiss</font>**<font style="color:rgba(0, 0, 0, 0.8);">。</font>
bash 复制代码
bash install_ascendfaiss.sh
  1. 安装RAG SDK。
bash 复制代码
bash  Ascend-mindxsdk-mxrag_<version>_linux-<arch>.run --install --install-path=<安装路径> --platform=<npu_type>
# 安装第三方依赖包
pip3 install  rank_bm25==0.2.2 langchain-opengauss==0.1.3
# 安装依赖包
pip3 install -r <安装路径>/mxRag/requirements.txt

若出现如下回显信息,则表示软件成功安装。

Install RAG SDK successfully.

  1. 设置RAG SDK运行环境变量。
    1. 用vim打开文件~/.bashrc,在文件最后添加如下内容。
bash 复制代码
export MX_INDEX_FINALIZE=0
export PY_VERSION=python3.11
export LOGURU_FORMAT='<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> | <level>{level: <8}</level> | <cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - <level>{message!r}</level>'
export MX_INDEX_MODELPATH=/home/HwHiAiUser/Ascend/modelpath
# 设置index SDK安装路径,如果安装时未使用默认路径安装,请根据实际路径修改
export MX_INDEX_INSTALL_PATH=/home/HwHiAiUser/Ascend/mxIndex
export MX_INDEX_MULTITHREAD=1
export ASCEND_HOME=$HOME/Ascend/
export LD_LIBRARY_PATH=/home/HwHiAiUser/Ascend/mxIndex/lib:/home/HwHiAiUser/faiss/faiss1.10.0/lib:$LD_LIBRARY_PATH
export PYTHONPATH=/home/HwHiAiUser/.local/lib/$PY_VERSION/site-packages/mx_rag/libs:$PYTHONPATH
export LD_PRELOAD=$(ls /home/HwHiAiUser/.local/lib/$PY_VERSION/site-packages/scikit_learn.libs/libgomp-*):$LD_PRELOAD
source /home/HwHiAiUser/Ascend/ascend-toolkit/set_env.sh
source /home/HwHiAiUser/Ascend/nnal/atb/set_env.sh
source /home/HwHiAiUser/Ascend/mxRag/script/set_env.sh
css 复制代码
2. <font style="color:rgba(0, 0, 0, 0.8);">保存退出后运行如下命令让环境生效。</font>
bash 复制代码
source ~/.bashrc

四、构建一个小的问答知识库

知识库的问答流程

构建知识库

  1. 编译检索算子
python 复制代码
cd $MX_INDEX_INSTALL_PATH/tools/ && python3 aicpu_generate_model.py -t <chip_type> && python3 flat_generate_model.py -d <dim> -t <chip_type>  && cp op_models/* $MX_INDEX_MODELPATH 

参数说明:

  • -d 表示embedding模型向量化后的维度,因acge_text_embedding嵌入模型向量维度为1024,这里设置为-d 1024
  • -t <chip_type>表示芯片类型。
  1. 创建知识文档

/home/HwHiAiUser目录下创建文档gaokao.txt

python 复制代码
2024年高考语文作文试题
新课标I卷
阅读下面的材料,根据要求写作。(60分)
随着互联网的普及、人工智能的应用,越来越多的问题能很快得到答案。那么,我们的问题是否会越来越少?
以上材料引发了你怎样的联想和思考?请写一篇文章。
要求:选准角度,确定立意,明确文体,自拟标题;不要套作,不得抄袭;不得泄露个人信息;不少于800字。
  1. 构建知识库

根据实际情况修改代码中的文件路径、模型路径等默认参数

python 复制代码
python3 rag_demo_knowledge.py --file_path "/path/to/gaokao.txt"
  1. 运行测试

运行样例代码能够打印出刚刚创建的文档名称则说明构建知识库成功

python 复制代码
['gaokao.txt']

测试检索问答

  1. 执行在线问答样例
python 复制代码
python3 rag_demo_query.py --query "请描述2024年高考作文题目" 
  1. 获取结果
python 复制代码
{
    'query': '请描述2024年高考作文题目',
    'result': '题目:新时代下的生活\n\n材料:\n\n随着科技的不断发展,人们的生活逐渐便利。各种智能设备的应用,让我们的生活更加便捷。然而,在这种便利背后,我们是否面临着一些问题?\n\n请根据以上材料,结合自己的思考,以新时代下的生活为题材,自拟标题,写一篇议论文。',
    'source_documents': [
        {
            'metadata':
            {
                'source': '/home/HwHiAiUser/gaokao.txt'
            },
            'page_content': '2024年高考语文作文试题\n新课标I卷\n阅读下面的材料,根据要求写作。(60分)\n随着互联网的普及、人工智能的应用,越来越多的问题能很快得到答案。那么,我们的问题是否会越来越少?\n以上材料引发了你怎样的联想和思考?请写一篇文章。\n要求:选准角度,确定立意,明确文体,自拟标题;不要套作,不得抄袭;不得泄露个人信息;不少于800字。'
        }
    ]
}

正常输出内容,且与我们的预先构建的知识库内容高度重合,则说明这个简易的问答知识库就构建成功了!

五、总结

到这里,有关 RAG 的技术原理、RAG SDK 架构功能等基础知识也介绍完了,也成功的完成了其部署,这次的实操,不仅更加的了解了有关 RAG 方面的知识,也了解到了昇腾在 RAG SDK 方面的发展,通过 RAG SDK 可以快速的构建基于昇腾平台问答系统的能力,提供强大的文档解析、知识库管理等能力,至多文档、表格、PDF、图片等多种类型文件解析,也极大的降低了普通人大模型应用的开发门槛,通过使用 RAG SDK 提供的模块化功能接口,可以做到按需调用,使用少量的代码就可以实现功能。

大模型快速发展的今天,RAG 方面的技术也在飞速的发展,了解和学习相关知识已经愈发的重要,动动手,你也可以为你的大模型接上 RAG。

相关推荐
sheji341628 分钟前
【开题答辩全过程】以 基于springboot游泳馆管理系统为例,包含答辩的问题和答案
java·spring boot·后端
5***r93532 分钟前
SpringBoot 与 SpringCloud的版本对应详细版
spring boot·后端·spring cloud
大千AI助手37 分钟前
多维空间的高效导航者:KD树算法深度解析
数据结构·人工智能·算法·机器学习·大千ai助手·kd tree·kd树
天天摸鱼的java工程师41 分钟前
MySQL 的锁机制和数据隔离:一个 Java 老兵的实战总结
java·后端
undsky1 小时前
【RuoYi-SpringBoot3-Pro】:若依企业级增强版 —— 让开发更安全高效
spring boot·后端
凋零蓝玫瑰1 小时前
几何:数学世界的空间密码
人工智能·算法·机器学习
踏浪无痕1 小时前
准备手写Simple Raft(四):日志终于能"生效"了
分布式·后端
程序员西西1 小时前
SpringBoot 隐式参数注入:告别重复代码,让 Controller 更优雅
java·后端
嘻哈baby1 小时前
Ansible自动化运维:从入门到批量管理100台服务器
后端