目录
可以直接跳转到>实施步骤<这个目录查看安装部署流程,demo展示可以访问demo展示页,图像生成的key使用次数很少,其他功能NV那边也有调用次数限制,次数被用完就不会有响应了
NVIDIA AI-AGENT夏季训练营
DjangoNIMBot
通过调用nvidia nim平台的大模型api和django web框架实现的一个简单的ai对话应用,可以访问这个地址尝试一下功能部署地址(不要开代理)
- 项目名称:AI-AGENT夏季训练营 — RAG智能对话机器人
- 报告日期:2024年8月18日
- 项目负责人:金日耀
项目概述
使用NVIDIA NIM平台的大模型API和django web框架实现了一个简单的网页问答机器人、支持基于RAG的生成式模型,同时也使用了LLAMA3和sdxl-turbo两个模型的API接口实现了简单的对话和图像生成功能。
技术方案与实施步骤
- 模型选择:选择的三个模型分别是ai-phi-3-small-128k-instruct、llama-3.1-405b-instruc以及sdxl-turbo、RAG模型是参照教学课件例子中的模型、尝试使用llama-3.1-405b-instruc没成功、选择sdxl-turbo的理由是在Try NVIDIA NIM APIs有比较详细的使用例子,其他图像生成模型的接口文档太长了不适合短时间掌握。
- 数据的构建:数据整理了训练营的简介信息和每天的日程安排、用chatapt做了数据清洗(原有数据的各种符号以及并列类似排比句的信息直接作为RAG数据模型生成的回答很奇怪,用GPT总结了一下再输入给模型才正常)。
- 通过交互式UI调用不同的接口实现不同功能的整个(关键因素是缺少能通过用户的描述判断其意图的模型或者是什么东东,抑或是phi3这个多模态模型有的输出中能有什么标识符来判断结果是图片还是纯文本抑或是文件以便于之后UI程序的展示处理)
实施步骤
整个项目代码在项目仓库中、我抽取了必要的依赖信息写在了requirements.txt文件里(可能有些落了依据报错信息也能很好的安装上)
先克隆项目文件
git clone https://github.com/JinRiYao2001/DjangoNIMBot.git
window系统的话在项目的DjangoNIMBot/django_nimbot目录下执行以下命令,我的py版本是3.10
pip install -r requirements.txt
python manage.py migrate
python manage.py runserver
会弹出一个输入框,在输入框中输入NIM平台申请的key
在NIM平台通过以下步骤获取key(有使用次数的),在页面选择一个模型,模型简介下面有python等其他语言的demo,边上会有一个get api key的按钮去生成一个key(部分模型的可能没有详细的demo)
然后访问http://127.0.0.1:8000/api/chat_ui/
项目默认跑在8000端口,可以修改runserver命令换端口
我是在settings.py里面写环境变量写入的步骤,更倾向于使用者在系统里先配好环境变量,更改settings.py这个文件里面的环境变量载入逻辑
项目用的是django默认的本地数据库,有条件的使用者可以换成自己的数据库
settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
每个接口的权限和认证我都设置为空,使用者可以根据自己的情况选择认证方式,实现历史记录查查看的功能
@action(detail=False, methods=["POST"], permission_classes=[])
RAG实现的关键代码就django工程的app load步骤中,这样只有启动工程的时候才会执行该步骤,提高效率,这里会调用一个embedding模型去生成向量数据库,可以在这边将文本文件替换成自己的。部署在了部署地址这个地址(不要开网页代理,公网IP之后我会更换掉)
chat/apps.py
from django.apps import AppConfig
from langchain_nvidia_ai_endpoints import NVIDIAEmbeddings
import os
from langchain.vectorstores import FAISS
from langchain_core.prompts import ChatPromptTemplate
from langchain.text_splitter import CharacterTextSplitter
class ChatConfig(AppConfig):
name = 'chat'
current_working_directory = os.getcwd()
print("Current working directory:", current_working_directory)
def ready(self):
embedder = NVIDIAEmbeddings(model="ai-embed-qa-4")
ps = os.listdir("./chat/zh_data/")
data = []
sources = []
for p in ps:
if p.endswith('.txt'):
path2file = "./chat/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)
documents = [d for d in data if d != '\n']
text_splitter = CharacterTextSplitter(chunk_size=400, separator=" ")
docs = []
metadatas = []
for i, d in enumerate(documents):
splits = text_splitter.split_text(d)
docs.extend(splits)
metadatas.extend([{"source": sources[i]}] * len(splits))
store = FAISS.from_texts(docs, embedder, metadatas=metadatas)
store.save_local('./chat/zh_data/nv_embedding')
store = FAISS.load_local("./chat/zh_data/nv_embedding", embedder, allow_dangerous_deserialization=True)
retriever = store.as_retriever()
prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"Answer solely based on the following context:\n<Documents>\n{context}\n</Documents>",
),
("user", "{question}"),
]
)
self.retriever = retriever
self.prompt = prompt
项目成果与展示
将业务数据统计作为向量数据库,这个小项目可以做一个简单的客服机器人
问题与解决方案
问题分析:生成的向量数据信息对于数据内容和格式的依赖太高了、导致输出的内容很抽象
解决措施:用gpt总结了洗了一下数据
项目总结与展望
整个项目过程中通过NIM平台提供的demo实现了一些简单的功能我个人还是挺感兴趣的,希望之后NIM平台的功能和使用文档能更丰富(吐槽有些模型的文档太难看了)
虽然使用不同的接口实现不同的相应但是没有实现一个真正的多模态
希望之后有机会能找到检测用户意图的方法或者更深入的去了解一下langchain_nvidia_ai_endpoints的接口
RAG模型输出的数据太死板了、基本和源数据一样,希望之后有机会更深层次去探索RAG技术
附件与参考资料
项目部署的网页地址可以访问尝试功能(不要开代理访问!可以访问这个ip去尝试一下功能,之后我会关掉)
demo展示网址(之后会将公网ip换成域名的/(ㄒoㄒ)/~~):
Chat App
NV-NIM平台网址:
我的仓库地址:
https://github.com/JinRiYao2001/DjangoNIMBothttps://github.com/JinRiYao2001/DjangoNIMBot