【2024 NVIDIA 夏季训练营】基于NIM的reg agent实现

概要

项目名称:AI-AGENT夏季训练营 — RAG智能对话机器人
报告日期:2024年8月18日
项目负责人:[Henry]

项目概述

技术方案与实施步骤

  • 模型选择:
    对于一个linux驱动工程师而言,经常需要阅读大量的芯片手册,少则数百页,多则数千页。如果将目标数据手册做向量化处理,添加到向量数据库中,就可以帮助工程师有针对地获取芯片关键信息。
    本项目采用rag技术结合llama-3.1-405b模型实现一个agent,达到芯片数据手册快速检索的目的,帮助嵌入式驱动工程师快速获取芯片的能力图谱,提高开发效率。
    llama-3.1-405b模型是由 Meta(原 Facebook)发布的最新开源大型语言模型。它在多个方面展现出了非常高的性能,甚至在某些基准测试中超越了一些闭源的顶级模型,比如 GPT-4 和 Claude 3.5 Sonnet。 拥有约 4050 亿个参数,能够处理长达 128K 个标记的上下文,它可以处理更长的文档和更复杂的文本结构,这对于理解长文本和进行长文本生成至关重要。
    在这里插入图片描述
    上图解释了RAG技术和LLM结合的工作模式,它有很多优势。
    避免重新训练:像llama这样的大模型训练需要依赖丰富的硬件资源,而且非常费时间,RAG避免了重新训练整个模型,大大节省了时间和计算资源。
    数据更新及时:LLM是静态的,无法获取最新的数据和信息。RAG弥补的这个缺陷,对于保持生成内容的相关性和时效性非常重要。
    细分行业领域落地:以后LLM的发展方向,一个是小型化,可以在手机,车载智驾等硬件算力有限的设备上运行。另一个是在特定的行业落地,比如网上销售客服。RAG的灵活性和时效性将拖动其发展。
    关键数据保密性和知识产权的维护:如何保证自己的知识产权(文章,新闻稿,图画,声音等)在未授权的情况下被用于LLM训练,用于生成融入到其他作品中?如何保证公司的关键数据不被LLM滥用?RAG是一种很好的方法。

  • 数据的构建:

LLM-RAG交互流程图

  • 数据构建过程
    构建知识库:
    选择或创建一个包含相关文档的知识库,这些文档可以是网页、文章、书籍等。
    知识库应该尽可能覆盖广泛的领域和话题,以提高模型的通用性和适应能力。
    文档预处理:
    对知识库中的文档进行预处理,例如去除噪声、标准化文本、分句分词等。
    文档可能需要被分割成较小的段落或句子,便于后续检索。
    构建倒排索引:
    构建一个倒排索引,使得可以根据关键词快速检索到相关的文档片段。
    倒排索引是一种数据结构,它存储了文档中所有词语的出现位置信息,方便快速查询。
  • 文档向量化:
    将文档转换为向量表示,这有助于后续的相似度计算和检索。
    可以使用诸如TF-IDF、Word2Vec、BERT等技术来进行文档向量化。
  • 优势
    精确检索:结合了检索技术的优势,可以从知识库中找到最相关的文档片段,提高了生成内容的准确性和可靠性。
    语义理解: 预训练语言模型能够捕捉复杂的语义关系,使得生成的内容更加自然和流畅。
    上下文感知: RAG模型能够利用上下文信息生成更加连贯和合理的回答。
    灵活扩展: 知识库可以随时更新和扩展,而无需重新训练整个模型。
    高效性: 检索技术可以在推理阶段快速定位相关信息,减少了生成过程中的计算成本。
    可控性: 由于RAG模型依赖于知识库中的信息,因此可以通过调整知识库来控制生成内容的方向和范围。

实施步骤

  • 环境搭建:
    本项目基于x86_64计算机,windows操作系统
    需要的背景知识:langchain,anaconda,jypyter lab。
#在如下网站下载exe 安装miniconda
 https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/
#运行annaconda powershell
#创建python 3.8虚拟环境
conda create --name ai_endpoint python=3.8
#进入虚拟环境
conda activate ai_endpoint
#安装nvidia_ai_endpoint工具
pip install langchain-nvidia-ai-endpoints 
#安装langchain-community
pip install langchain-community
#安装Jupyter Lab
pip install jupyterlab
pip install jupyterlab_vim
#安装langchain_core
pip install langchain_core
#安装langchain
pip install langchain
#安装matplotlib
pip install matplotlib
#安装Numpy
pip install numpy
#安装faiss, 这里如果没有GPU可以安装CPU版本
pip install faiss-cpu==1.7.2
#安装OPENAI库
pip install openai
#运行jupyterlab
jupyter-lab


  • 获取nvidia NIM api key
#打开如下网站 登录后选择需要的llm  点击“get api key”
https://build.nvidia.com/
#将获取的api key复制粘贴到工程代码中 就可以访问NIM

NIM api key

  • 代码实现(必写): 列出关键代码的实现步骤,可附上关键代码截图或代码块。

初始化ai-embed-qa-4向量模型

from langchain_nvidia_ai_endpoints import NVIDIAEmbeddings

embedder = NVIDIAEmbeddings(model="ai-embed-qa-4")

获取文本数据集

import os
from tqdm import tqdm
from pathlib import Path
from PyPDF2 import PdfReader

# Here we read in the PDF data and prepare them into vectorstore
ps = os.listdir("./zh_data/")
data = []
sources = []

for p in tqdm(ps, desc="Processing files"):
    if p.endswith('.pdf'):
        path2file = "./zh_data/" + p
        with open(path2file, 'rb') as file:
            reader = PdfReader(file)
            for page in reader.pages:
                text = page.extract_text()
                if text:
                    lines = text.split('\n')
                    for line in lines:
                        if len(line.strip()) >= 1:
                            data.append(line)
                            sources.append(path2file)

print("Data reading complete.")

进行一些基本的清理并删除空行

documents=[d for d in data if d != '\n']
len(data), len(documents), data[0]

将文档处理到 faiss vectorstore 并将其保存到磁盘
使用了langchain库来创建一个向量数据库,并使用了NVIDIA的聊天接口作为语言模型的后端。

# Here we create a vector store from the documents and save it to disk.
from operator import itemgetter
from langchain.vectorstores import FAISS
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain.text_splitter import CharacterTextSplitter
from langchain_nvidia_ai_endpoints import ChatNVIDIA
import faiss
# 只需要执行一次,后面可以重读已经保存的向量存储
# text_splitter = CharacterTextSplitter(chunk_size=400, separator=" ")
# docs = []
# metadatas = []

# for i, d in enumerate(documents):
#     splits = text_splitter.split_text(d)
#     #print(len(splits))
#     docs.extend(splits)
#     metadatas.extend([{"source": sources[i]}] * len(splits))

# store = FAISS.from_texts(docs, embedder , metadatas=metadatas)
# store.save_local('./zh_data/nv_embedding')

重读之前处理并保存的 Faiss Vectore 存储

# Load the vectorestore back.
store = FAISS.load_local("./zh_data/nv_embedding", embedder,allow_dangerous_deserialization=True)

提出问题并基于llama-3.1-405b模型进行RAG检索

retriever = store.as_retriever()

prompt = ChatPromptTemplate.from_messages(
    [
        (
            "system",
            "Answer solely based on the following context:\n<Documents>\n{context}\n</Documents>",
        ),
        ("user", "{question}"),
    ]
)

chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)

chain.invoke("bcm89564 是否有组播功能")

项目成果与展示

  • 应用场景展示:
  • 对于一个linux驱动工程师而言,经常需要阅读大量的芯片手册,少则数百页,多则数千页。如果将目标数据手册做向量化处理,添加到向量数据库中,就可以帮助工程师有针对地获取芯片关键信息。

问题与解决方案

  • 问题1
    分析:
    Step 6a - 将文档处理到 faiss vectorstore 并将其保存到磁盘
    执行报错
    error

解决措施:
起初“ModuleNotFoundError”,认为模型没有找到,怀疑是指定路径不对导致在NIM服务器上找不到模型。何老师说把报错“往下拉”,要看到最后才能定位问题的原因。发现已经给出答案“pip install -U langchain-community”。推出jupyterlab,安装langchain-community后,可以正常执行了。

  • 问题2
    因为芯片的手册大多为pdf而不是txt,所以要修改demo,从PDF文件中读取文本并准备数据以构建向量数据库。
    搜索后发现可以采用PyPDF2 库来读取PDF文件,并对之前的代码进行相应的修改。
#首先
pip install PyPDF2
#然后import
from PyPDF2 import PdfReader
  • 问题3
    芯片手册是加密的 无法提取文本
File ~\.conda\envs\ai_endpoint\lib\site-packages\PyPDF2\_encryption.py:162, in AES_CBC_encrypt(key, iv, data)
    161 def AES_CBC_encrypt(key: bytes, iv: bytes, data: bytes) -> bytes:
--> 162     raise DependencyError("PyCryptodome is required for AES algorithm")

DependencyError: PyCryptodome is required for AES algorithm

通过pip命令来安装PyCryptodome库

pip install pycryptodome
Processing files: 100%|| 4/4 [00:03<00:00

附件与参考资料

https://blog.csdn.net/kunhe0512/article/details/140910139

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值