RAG加持:用极简代码构建你的AI操作系统运维助手

RAG加持:用极简代码构建你的AI操作系统运维助手

一、项目概述

摘要: 在AI技术的浪潮中,我们推出了一款基于RAG模型的操作系统运维助手,它不仅解决了传统运维中的痛点,还通过极简的代码实现了强大的功能。本文将详细介绍本项目的特点与亮点。

  1. 技术融合创新:结合了NVIDIA NIM的大模型接口和langchain的强大库函数,我们的AI助手在技术层面实现了创新融合,为用户提供了前所未有的运维体验。

  2. 极简代码实现:通过精心设计的架构,我们大幅减少了代码量,使得项目易于理解和维护,同时也降低了后续开发和升级的难度。

  3. 无需自行训练:利用NVIDIA NIM提供的大模型接口,我们避免了自行训练大模型的复杂性和成本,确保了模型的高性能和最新知识库的即时更新。

  4. 交互式文本界面:通过gradio库,我们为AI助手提供了一个直观、易用的交互式文本界面,使用户能够快速上手并有效利用AI助手的功能。

  5. 语音播放功能:集成了微软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.051 项指标上领先,而在 35 项指标上落后。在 14 项指标上,两者的表现相同(持平)。\n\n- 在 CULinux 3.0 与 openEuler 22.03 的比较中,CULinux 3.055 项指标上领先,而在 14 项指标上落后。在 31 项指标上,两者的表现相同(持平)。

这个答案就是和我们提供的文档是吻合的!

4. 集成与部署:

通过gradio库,部署在了自己的电脑上!

四、项目成果与展示
1. 应用场景:

(1)操作系统的运维助手

​ 可以作为我们自己的操作系统的运维助手,问一些关于我们操作系统的问题是,可以快速地得到答案。同时可以起到一个宣传我们操作系统的一个作用。

2. 功能演示:

通过gradio,通过web访问自己的CULinux运维助手。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值