RAG加持:用极简代码构建你的AI操作系统运维助手
一、项目概述
摘要: 在AI技术的浪潮中,我们推出了一款基于RAG模型的操作系统运维助手,它不仅解决了传统运维中的痛点,还通过极简的代码实现了强大的功能。本文将详细介绍本项目的特点与亮点。
-
技术融合创新:结合了NVIDIA NIM的大模型接口和langchain的强大库函数,我们的AI助手在技术层面实现了创新融合,为用户提供了前所未有的运维体验。
-
极简代码实现:通过精心设计的架构,我们大幅减少了代码量,使得项目易于理解和维护,同时也降低了后续开发和升级的难度。
-
无需自行训练:利用NVIDIA NIM提供的大模型接口,我们避免了自行训练大模型的复杂性和成本,确保了模型的高性能和最新知识库的即时更新。
-
交互式文本界面:通过gradio库,我们为AI助手提供了一个直观、易用的交互式文本界面,使用户能够快速上手并有效利用AI助手的功能。
-
语音播放功能:集成了微软edge-tts库,我们的AI助手能够将文本输出转换为语音播放,极大地提升了用户体验,尤其是对于需要双手操作或视力不便的用户。
二、技术方案与实施步骤
1. 模型选择:
本项目大模型选用的是微软的phi-3-medium-128k-instruct
,这个模型相对较小且高效,再对比lamma等模型是,感觉输出效果更好,还可以处理1024k的长文本,也能够支持中英文。
2. 数据的构建:
所用的数据是关于CULinux的pdf、docx文档,用于构建知识库的嵌入模型选用NVIDIA的ai-embed-qa-4
,再做RAG的知识库的匹配的时候,还是挺准确的。知识库搜索匹配时用的算法为 FAISS
三、实施步骤
1. 环境搭建:
基础的环境搭建过程,请参考训练营nvidia部分环境配置教程:https://blog.csdn.net/kunhe0512/article/details/140910139
pip install gradio
pip install edge-tts
pip install -i https://mirrors.aliyun.com/pypi/simple PyPDF2
pip install python-docx
2. 代码实现:
2.1 通过NVIDIA NIM API调用大模型
参考:NVIDIA NIM
from langchain_nvidia_ai_endpoints import ChatNVIDIA
os.environ["NVIDIA_API_KEY"] = "nvapi-***************************MBc"
llm = ChatNVIDIA(model="microsoft/phi-3-medium-128k-instruct", max_tokens=1024)
result = llm.invoke("CULinux的稳定性怎么样?")
print(result.content)
2.2 构建知识库
这里支持读取.txt
.pdf
.docx
,还可以根据你的需要添加更多的文本类型。
# Here we read in the text data and prepare them into vectorstore
ps = os.listdir("./CULinux/docx")
data = []
sources = []
for p in ps:
if p.endswith('.txt'):
path2file="./CULinux/docx/"+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)
elif p.endswith('.pdf'):
path2file = "./CULinux/docx/" + p
with open(path2file, "rb") as f:
reader = PyPDF2.PdfReader(f)
for page in reader.pages:
text = page.extract_text()
if text:
lines = text.splitlines()
for line in lines:
if len(line) >= 1:
data.append(line)
sources.append(path2file)
elif p.endswith('.docx'):
path2file = "./CULinux/docx/" + p
doc = docx.Document(path2file)
for paragraph in doc.paragraphs:
text = paragraph.text
if len(text) >= 1:
data.append(text)
sources.append(path2file)
这里文档在分块是选择的大小为800,根据你的模型大小与问题的需要选择,不要超过你的模型的最大输入长度。
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 NVIDIAEmbeddings
# 只需要执行一次,后面可以重读已经保存的向量存储
text_splitter = CharacterTextSplitter(chunk_size=800, 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))
embedder = NVIDIAEmbeddings(model="ai-embed-qa-4")
store = FAISS.from_texts(docs, embedder, metadatas=metadatas)
最后利用langchain,将之前的东西串起来,就构建了属于你自己的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()
)
2.3 文字转语音
利用微软的edge-tts
将模型生成的文字,转化为语音输出
from IPython.display import Audio
import subprocess
edge_command=f'edge-tts --text "{result}" -v=zh-TW-HsiaoChenNeural --write-media ./CULinux/audio/demo.mp3'
os.system(edge_command)
subprocess.run(edge_command, shell=False)
Audio("./CULinux/audio/demo.mp3", autoplay=True)
3. 测试与调优:
我们对比了使用RAG与不适用RAG问模型关于CULinux的问题,以下是答案的对比:
3.1 不使用RAG的时
llm = ChatNVIDIA(model="microsoft/phi-3-medium-128k-instruct", max_tokens=1024)
result = llm.invoke("CULinux的稳定性怎么样?")
print(result.content)
CULinux 是一个基于 Linux 的开源操作系统,旨在为各种硬件平台提供可靠和高效的运行环境。作为一个开源项目,CULinux的稳定性取决于其社区和贡献者的贡献。虽然它不像商业操作系统那样有广泛的支持,但由于其开源性质,它可以通过社区支持和定期更新来实现稳定性。用户可以参与开发过程,报告错误,或者根据自己的需求进行定制,以提高系统的稳定性。
请记住,由于CULinux是一个开源项目,因此它的稳定性可能会因特定版本和用户配置而有很大差异。建议始终使用最新的稳定版本,并参考社区论坛获取支持。
会发现虽然大模型并不知道CULinux操作系统,但是他还是在尝试回答问题,而且该答案看起来也像真的一样!这个就是大模型所产生的幻觉!
3.2 以下是使用RAG时
chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
chain.invoke("CULinux的稳定性怎么样?")
根据提供的文档,CULinux 3.0 在性能对比测试报告中显示了以下数据:\n\n- 对于 x86_64 架构,CULinux 3.0 运行了 307 个总运行案例。这些案例分为 113 个通过(pass),96 个失败(fail),98 个被跳过(skip)。\n\n- 在 CULinux 3.0 与 Anolis 8.6 的比较中,CULinux 3.0 在 51 项指标上领先,而在 35 项指标上落后。在 14 项指标上,两者的表现相同(持平)。\n\n- 在 CULinux 3.0 与 openEuler 22.03 的比较中,CULinux 3.0 在 55 项指标上领先,而在 14 项指标上落后。在 31 项指标上,两者的表现相同(持平)。
这个答案就是和我们提供的文档是吻合的!
4. 集成与部署:
通过gradio
库,部署在了自己的电脑上!
四、项目成果与展示
1. 应用场景:
(1)操作系统的运维助手
可以作为我们自己的操作系统的运维助手,问一些关于我们操作系统的问题是,可以快速地得到答案。同时可以起到一个宣传我们操作系统的一个作用。
2. 功能演示:
通过gradio
,通过web访问自己的CULinux运维助手。