项目名称:AI-AGENT夏季训练营 — RAG智能对话机器人
报告日期:2024年8月17日
项目负责人:我
项目概述:
本项目开发了一款简单便捷,易于部署的智能问答机器人,基于轻量级大语言模型,可对指定领域(本项目指定txt文件内容)做出较精准回答。相较于直接使用语言大模型,本项目加入RAG使检索更精准,同时轻量级模型及简单的环境配置,使得本项目移植性强,可作为学习或者起步的锚点,让更多人体验从无到有的模型搭建。
技术方案与实施步骤
1. 模型选择:
项目采用了英伟达NIM平台上的Meta LLaMA-3.1-405b-instruct模型与基于Phi-3-small-128k-instruct模型的RAG(检索增强生成)方案,目标是提供强大的自然语言处理能力与检索增强的生成机制。
- LLaMA系列模型在生成式任务中表现优异,尤其适合指令驱动(instruct)的生成场景。LLaMA-3.1-405b是目前性能领先的大模型,具备广泛的知识储备,能够对复杂问题进行准确且深入的生成。
- Phi-3-small模型参数规模相对较小(128k),具备较高的效率,特别适合检索任务。该模型可以在处理高效和准确的信息检索时保持较低的计算资源消耗。Phi-3-small-128k-instruct经过了专门的微调与优化,使其更适合用于与大语言模型的RAG集成,在快速检索与反馈上具备优势。
- RAG架构的核心优势在于结合了检索与生成的双重能力。通过将生成任务与强大的信息检索模型配合,RAG可以在生成前查询大量知识库或文档,从而在生成时能够参考最新、最相关的信息,提高生成内容的准确性和一致性。
2. 数据的构建:
- 数据切分:将大型文本分割为更小的片段,便于后续的向量化和检索。
- 向量化处理:使用嵌入模型将文本转化为高维向量,使文本能够被编码为语义向量,支持基于相似度的快速匹配。
- 检索与生成结合:通过RAG模型,将检索到的最相关文档与用户问题结合,利用LLM生成连贯的答案。
实施步骤:
步骤 1 - 环境初始化和必要库的导入
-
环境搭建:配置python环境,详细可见这篇2024 NVIDIA开发者社区夏令营环境配置指南(Win & Mac)_csdn 2024nvidia开发者-CSDN博客补充的是:Anaconda和Miniconda有一个就够用。
除了上面的还需要下载langchain-community
pip install -U langchain-community
不要使用梯子如果超时,可以换国内镜像源。
这些库分别负责大语言模型的调用、向量检索和向量嵌入等功能。
步骤 2 - 加载 LLM 和向量嵌入模型
- 加载Meta的 LLM(大语言模型) 和用于向量化数据的 嵌入模型(embedder)。这是为后续的数据向量化处理和生成任务做准备的关键步骤。
from langchain_nvidia_ai_endpoints import ChatNVIDIA
from langchain_nvidia_ai_endpoints import NVIDIAEmbeddings
embedder = NVIDIAEmbeddings(model="ai-embed-qa-4")
llm = ChatNVIDIA(model="ai-phi-3-small-128k-instruct", nvidia_api_key=nvapi_key, max_tokens=512)
步骤 3 - 构建知识库(文档处理与分割)
- 通过导入文本文件或数据,对文本进行预处理并将其切分为小块。通过切分操作,数据可以更加高效地存储在向量空间中,便于后续的检索。
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)
documents=[d for d in data if d != '\n']
len(data), len(documents), data[0]
步骤 4 - 向量化数据并存储
- 使用预训练的嵌入模型将文本数据转换为向量表示(Embedding),然后将这些向量化后的数据存储在向量检索库 FAISS 中。这一步骤为后续的检索奠定了基础。
# 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
#将处理后的向量保存在local路径下(可以不用每次都重新生成)
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')
# 加载向量
store = FAISS.load_local("./zh_data/nv_embedding", embedder,allow_dangerous_deserialization=True)
步骤 5 - 提出问题并基于RAG模型进行检索
- 用户输入问题,系统基于RAG架构使用向量化检索模型(Phi-3-small-128k-instruct)从知识库中检索相关文档,并利用LLM生成最终的答案。
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("**问题**")
项目成果与展示:
- 应用场景展示: 对已有的规章制度或者服务信息,根据提问回答,适用于智能客服,办事流程助手等对于文本信息比较明确且专业的领域。
- 功能演示: (本测试例,基于小学生行为手册,回答小学生相关的疑问)
- 文本如下(.txt)
一、尊重他人
尊重老师
老师是我们学习的引路人,他们教给我们知识和做人的道理。我们要尊重老师,听从他们的教导。在课堂上认真听讲,积极回答问题,不打扰老师的讲课,不顶撞老师。课后遇到不懂的问题可以虚心请教老师,但要有礼貌地表达,不急不躁,耐心等待。
尊重同学
同学之间要互相尊重、互相帮助。每个人都有优点和不足,我们要学会包容他人的缺点,不取笑同学的不足或错误。不嘲笑、侮辱、欺负他人,发生冲突时要冷静处理,通过和平的方式解决问题。要做个有同理心的小学生,站在别人的角度考虑问题,感受他人的情绪。
尊重家长
家长是我们最亲近的人,他们为我们提供温暖的家庭环境,辛苦地抚养我们长大。我们要尊重父母长辈的意见,听从他们的教导,学会感恩。平时多与父母沟通交流,主动帮助他们做力所能及的家务,让父母感受到我们的爱和体贴。
二、热爱学习
认真听讲
学习是我们在学校的主要任务。我们要珍惜课堂时间,集中注意力,专心听老师讲课。保持良好的学习态度,做好课前准备,积极参与课堂活动,按时完成作业。
勤奋好学
要有明确的学习目标和计划,努力克服困难,遇到不懂的问题要主动请教老师或同学。课后要合理安排时间进行复习和预习,养成勤奋学习的好习惯。不要满足于已经掌握的知识,积极探索新的领域,不断进步。
保持好奇心
学习不止在课堂上,生活中也有许多值得我们探索和学习的东西。保持对世界的好奇心,多观察、多思考,积极参加课外活动、读书和实践,开拓视野,培养多方面的兴趣爱好。
三、遵守纪律
遵守学校规则
学校是我们共同学习的场所,每个人都要遵守学校的规章制度。按时到校,不迟到、不早退、不旷课。在学校里不喧哗、不追逐打闹,注意安全。排队时要有序,不插队,不推搡他人。在任何场合都要保持良好的纪律,尊重他人的学习和生活环境。
遵守课堂纪律
课堂是学习的地方,必须保持安静和秩序。不要在课堂上讲话、打扰他人。上课时要集中注意力,不做与学习无关的事情。老师提问时要举手发言,不随便插话。要与同学们共同营造一个良好的学习环境。
文明举止
在学校里要注意个人的言行举止,不说脏话,不做不文明的动作。要爱护公物,不乱涂乱画,不破坏教室、走廊等公共设施。做一个讲文明、守纪律的小学生,养成良好的习惯,展现出积极向上的精神风貌。
四、友爱互助
关心同学
同学是我们在学校生活中的伙伴,遇到困难时要伸出援手,关心和帮助他们。不要只顾自己的事情,要学会照顾他人的感受,尤其是那些需要帮助的同学。通过互相帮助,我们可以共同进步,营造和谐的学习氛围。
团结合作
在团队活动中,要学会与他人合作,共同完成任务。每个人都有不同的特长,要尊重并利用这些差异,为集体贡献力量。不要争强好胜,要学会谦让和合作,齐心协力取得更好的成绩。
分享快乐
快乐是分享出来的,遇到好玩的事情可以与同学分享,让更多的人感受到快乐和幸福。要做一个热情、开朗的小学生,与他人分享喜悦,传递正能量,让班级充满温暖和友爱。
五、爱护环境
爱护校园环境
校园是我们共同的学习场所,每个人都有责任保持它的整洁和美丽。不要乱丢垃圾,要主动捡起地上的废纸和塑料袋,保持校园干净。爱护花草树木,不践踏草坪,不随意折枝。
节约资源
要节约用水、用电,养成节约的好习惯。离开教室时记得关灯、关窗,节约每一度电、每一滴水。不要浪费学习用具和其他物品,做到勤俭节约。
保护环境
不仅要爱护校园环境,还要关注我们生活的地球。参加环保活动,学习环保知识,尽量减少使用一次性塑料制品,养成分类投放垃圾的习惯。保护环境,人人有责。
六、积极参与集体活动
参加学校活动
学校组织的各类活动是我们锻炼自我、增长见识的好机会。无论是运动会、艺术节还是志愿者活动,都应该积极参与,勇于挑战自我,展示自己的特长和才华。
参与班级活动
班级是我们的小集体,大家要团结一致,共同努力。在班级活动中,积极出谋划策,贡献自己的力量,增强集体荣誉感。
培养兴趣爱好
积极参加课外活动,培养自己的兴趣和爱好。通过参加各类社团活动、体育锻炼、艺术学习等,丰富自己的课余生活,发展多方面的能力。
提问:如何与他人合作?
回答如下:
问题与解决方案:
- 问题分析:
- 对于和环境配置,不同的人会遇到千奇百怪的报错,不必惊慌失措,将终端报错信息复制到网页搜索就好。
- 对于回答效果不好的情况,应该看看给出的文本质量以及模型搭建过程上有没有遗漏,可适当提高文本内容相关性、广度和深度再次尝试。
项目总结与展望:
- 项目评估: 项目在技术实现上取得了初步成功,但在文本广度和深度上还有提升空间。同时交互性比较单一,可考虑加入图片、文件作为输入输出方式。
- 未来方向:未来计划进一步扩大文本领域内容,同时保持绪分析的准确性,并探索更多领域的应用。