NVIDIA AI-AGENT夏季训练营
项目名称:AI-AGENT夏季训练营 — RAG智能对话机器人
报告日期:2024年8月18日
项目负责人:Kevinyu
项目概述:
随着科技的发展,人们的所需要的学习的知识成倍增加,如何能够进行有效率的学习以及在迅速的查询资料就成为了当代大学生的需求之一,所以我基于英伟达训练营的训练模板,完成的一个能够有效率的对“金属热处理”相关专业知识进行查询的代码,让当代大学生在眼花缭乱的众多资讯中能够迅速查找对应资料,在繁重的课业中得以喘息。
技术方案:
该项目使用了多种技术方案来构建多模态 AI Agent。其中包括 OpenAI GPT-3 模型用于对话生成和自然语言处理,NVIDIA API 用于模型部署和优化,NVIDIA LangChain 库用于文本处理和嵌入,FAISS 用于文本相似度搜索,以及LangChain Core 库用于文本流水线构建。通过这些技术方案的综合应用,项目成功实现了一个具备多模态处理能力的 AI Agent,能够提供连贯的回答和准确的信息。
RAG模型优势分析:
RAG 模型在项目中的应用带来了多个优势。它能够通过检索阶段获取相关信息,从而在生成阶段生成更连贯、更准确的回答。这样AI Agent 能够提供更具针对性的响应,满足用户的需求。其次RAG 模型可以提高回答的相关性,通过检索相关信息,生成的回答能够更加贴合用户的问题,提供更丰富、准确的信息。RAG 模型可以从大规模的知识库中检索相关信息,扩展了模型的知识范围,使其能够回答更广泛的问题。最后RAG 模型的应用还增加了可解释性,通过提供检索到的文本片段作为支持,用户可以更好地理解模型是如何得出答案的,增加对生成结果的信任。综上所述,RAG 模型的优势包括上下文感知、相关性提高、知识获取和可解释性,提高了生成回答的质量。
数据构建的过程、向量化处理方式及其优势:
数据构建过程包括读取文本数据、数据预处理、文本向量化和向量存储。其中,向量化处理方法使用了 NVIDIAEmbeddings 模型,将文本转换为向量表示。
这种向量化处理方法的优势在于能够捕捉文本的语义信息,实现语义表示;同时,它能够进行高效的向量计算,提高处理效率;另外,它还具有可扩展性,适用于处理大规模的文本数据集。
通过数据构建和向量化处理,将文本转换为向量表示,能够更好地利用文本的语义信息,并提高处理效率。这为后续的文本处理和信息检索任务提供了优势。
实施步骤:
环境搭建:
配置Python环境,
安装 .NET 8 (下载地址 [https://dotnet.microsoft.com/](https://dotnet.microsoft.com/)),
安装 Visual Studio Code,安装 Visual Studio Code 插件 (.NET Extension Pack 和 Python, Jupyter ),安装 Python库Jupyter。
必要库文件:
# ! pip install gradio
# ! pip install openai-whisper==20231117
# ! pip install ffmpeg==1.4
# ! conda install ffmpeg -y
# ! pip install edge-tts
# ! pip install transformers
# ! pip install openai
代码实现:
from openai import OpenAI
client = OpenAI(
base_url = "https://integrate.api.nvidia.com/v1",
api_key = "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"
)
completion = client.chat.completions.create(
model="meta/llama-3.1-405b-instruct",
messages=[{"role":"user","content":"什么是正火"}],
temperature=0.2,
top_p=0.7,
max_tokens=1024,
stream=True
)
for chunk in completion:
if chunk.choices[0].delta.content is not None:
print(chunk.choices[0].delta.content, end="")
Step 1 - 使用NVIDIA_API_KEY
import getpass
import os
if os.environ.get("NVIDIA_API_KEY", "").startswith("nvapi-"):
print("Valid NVIDIA_API_KEY already in environment. Delete to reset")
else:
nvapi_key = getpass.getpass("NVAPI Key (starts with nvapi-): ")
assert nvapi_key.startswith("nvapi-"), f"{nvapi_key[:5]}... is not a valid key"
os.environ["NVIDIA_API_KEY"] = nvapi_key
from langchain_nvidia_ai_endpoints import ChatNVIDIA
ChatNVIDIA.get_available_models()
Step 2 - 初始化SLM
这里我们使用 phi-3-small-128k-instruct
llm = ChatNVIDIA(model="ai-phi-3-small-128k-instruct", nvidia_api_key=nvapi_key, max_tokens=512)
result = llm.invoke("什么是正火")
print(result.content)
#输出:正火通常是指一种温暖、舒适的火焰,通常与安宁和安全的情绪联系在一起。在日常生活中,人们可能会在冬天点燃一些木材,以产生温暖的火焰,为家庭提供舒适的温度。此外,正火也可以用来形容某人的内在温暖和善良,比如一个善良的朋友或家人。
Step 3 - 初始化ai-embed-qa-4向量模型
from langchain_nvidia_ai_endpoints import NVIDIAEmbeddings
embedder = NVIDIAEmbeddings(model="ai-embed-qa-4")
Step 4 - 获取文本数据集
import os
from tqdm import tqdm
from pathlib import Path
# Here we read in the text data and prepare them into vectorstore
ps = os.listdir("./zh_data/")
data = []
sources = []
for p in ps:
if p.endswith('.txt'):
path2file="./zh_data/"+p
with open(path2file,encoding="utf-8") as f:
lines=f.readlines()
for line in lines:
if len(line)>=1:
data.append(line)
sources.append(path2file)
Step 5 - 进行一些基本的清理并删除空行
documents=[d for d in data if d != '\n']
len(data), len(documents), data[0]
Step 6a - 将文档处理到 faiss vectorstore 并将其保存到磁盘
# 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')
Step 6b - 重读之前处理并保存的 Faiss Vectore 存储
# Load the vectorestore back.
store = FAISS.load_local("./zh_data/nv_embedding", embedder,allow_dangerous_deserialization=True)
Step 7- 提出问题并基于phi-3-small-128k-instruct模型进行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("什么是正火")
#输出:正火是一种钢材加工过程,其目的是使低碳和中碳钢件及渗碳机件的组织细化,增加强度与韧性,减少内应力,改善切削性能。它是一种特殊形式的退火,冷却速度比退火快,可以缩短生产周期,更具经济性。
最后给模型生成简单的界面
import gradio as gr
def chat_agent(text):
# 在这里编写处理用户输入并生成文字输出的逻辑
response = chain.invoke(text)
return response
chat_interface = gr.Interface(fn=chat_agent,
inputs="text",
outputs="text",
title="Chat Test",
description="text input and generates text output",
allow_flagging="never")
chat_interface.launch()
应用场景:
在学习相关课程的大学生可以利用向此代码提问的方式来迅速查找有关于“金属热处理”相关专业知识,快速定位到知识点,协助解决有关问题。
功能演示:
如图中在对话框中向模型提出问题“什么是正火”,此模型能够根据问题进行准确回答。
附件与参考资料
https://www.nvidia.cn/training/online/
https://blog.csdn.net/Ma132001/article/details/141278547?spm=1001.2014.3001.5502