技术路线

前期调研智能答疑系统实现的技术路线,提出两种解决方案,一种是直接调用API,一种是本地部署大模型

调用API方式

  1. deepseek
    可以在deepseek官网上申请免费的API_Key
    环境要求:
    python>=3.10
    建议在Anaconda内创建一个虚拟环境,避免不同库之间的冲突
    1
    2
    conda create -n 虚拟环境名称 python=3.10 
    conda activate 虚拟环境名称
    使用方法:
    I 安装相关依赖
    pip install openai
    II 调用API
    以下是一个简单的python程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from openai import OpenAI

client = OpenAI(api_key="sk-8b6ffa84471e4539b364df3d5af7fdc6", base_url="https://api.deepseek.com") # 在deepseek官网申请免费的API

response = client.chat.completions.create(
model="deepseek-chat",
messages=[
{"role": "system", "content": "You are a helpful assistant"},
{"role": "user", "content": "什么是SQL注入"}, # 在content中修改你的问题
],
stream=False
)

print(response.choices[0].message.content)

以下是由cp提供的更友好的交互方式的python程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
from openai import OpenAI
import time
import datetime
import os

day = datetime.datetime.now().strftime("%Y-%m-%d") + ".txt"
t = datetime.datetime.now().strftime("%H-%M-%S")
logfile = open(os.path.join('..', 'log', day), 'a')
logfile.write(t + "\n")
logfile.write("Chat Start\n")

url = "https://api.deepseek.com"
api_key = "sk-6447d4602e0e471093715cff77ffa585"
client = OpenAI(api_key=api_key, base_url=url)

while True:
n = 0
user_message = input("User: ")
if user_message == "Q":
break
print("System: ", end='')
message=[
{"role": "system", "content": "You are a helpful assistant"},
{"role": "user", "content": user_message},
]
model = "deepseek-chat" # deepseek-chat, deepseek-coder
response = client.chat.completions.create(model=model,messages=message,stream=False)
logfile.write("User: " + user_message + '\n' + "System: " + response.choices[0].message.content + '\n')
for i in response.choices[0].message.content:
print(i, end='')
time.sleep(0.02)
# print(response.choices[0].message.content)
print()

logfile.write("Chat Over\n\n")
logfile.close()
print("Chat Over")

  1. openai_key
    penai官网获取
    需要一点技术和手段,使用方法请参考官方文档

本地部署大模型

在模型选择上,我们主要调研了由清华大学开源的ChatGLM-8b大模型和由Meta开发的LLama3

  1. 模型介绍
  • LLaMA3:

    • 由 Meta(前 Facebook)开发。
    • LLaMA(Large Language Model Meta AI)的目标是提供高效的、可扩展的大型语言模型,并在学术研究和工业应用中得到广泛应用。
    • Meta 推出了多个版本,包括 LLaMA 1、LLaMA 2,预计 LLaMA 3 会在这些基础上进一步改进。
    • LLaMA 系列模型专注于开放的、多任务处理能力,适合于多种下游任务,如文本生成、翻译、对话、代码生成等。
  • ChatGLM:

    • 由清华大学 KEG 实验室和 Zhipu.AI 联合开发的中文-英文双语语言模型。
    • ChatGLM 专注于中文场景的自然语言处理和对话系统,并提供了双语支持,特别在中文对话场景中有出色的表现。
    • ChatGLM 已经有多个版本(ChatGLM-6B、ChatGLM-2 等),其中包含 60 亿参数模型,目标是提供轻量化、高效的对话模型,适合资源受限的环境。
  1. 模型结构与参数
  • LLaMA3:

    • LLaMA 模型以其高参数效率闻名,通常在参数量相对较少的情况下也能实现出色的性能。
    • LLaMA 系列模型在其压缩和训练技术上有显著创新,使得它们可以在相对较小的计算资源下运行较大的模型。
    • 预计 LLaMA3 也会延续这些特点,进一步优化推理效率和可扩展性。
  • ChatGLM:

    • ChatGLM 模型的版本如 ChatGLM-6B 使用 60 亿参数,虽然参数量较小,但在对话生成和任务处理方面表现出色。
    • 其设计更注重在有限资源下的推理效率,尤其是适用于中文和双语任务的细微调整,使其成为在资源有限的应用场景中的首选。
  1. 主要技术特点
  • LLaMA3:

    • 高效的参数化设计,能够在性能和资源消耗之间实现良好的平衡。
    • 适用于多语言和多任务场景,包括生成、理解、翻译等任务。
    • 由于 LLaMA 是 Meta 的开源项目,研究人员和开发者可以自由下载和使用这些模型进行开发。
    • 更大的通用性,能够处理不同类型的语言任务。
  • ChatGLM:

    • 专门针对中文语言处理进行优化,尤其在中文对话生成和翻译方面有明显优势。
    • ChatGLM 提供了跨平台的易用性,在服务器端或本地运行时资源占用较少,因此适合部署到各种硬件环境中。
    • ChatGLM 在训练过程中进行了大量的中文语料优化,使得它在处理中文的对话、问答等任务上表现更自然、更符合实际应用需求。
  1. 应用场景
  • LLaMA3:

    • 适合于多语言、多任务处理,广泛应用于文本生成、机器翻译、总结、问答系统等。
    • 适合研究机构和企业进行定制化应用,特别是在需要对多个不同任务进行统一处理的情况下。
  • ChatGLM:

    • 由于其在中文处理方面的优化,ChatGLM 更适合中文对话系统、客服机器人等应用场景。
    • 在双语应用中表现出色,特别是针对中文和英语之间的翻译与沟通。
    • 适合企业在中文相关的垂直领域(如客服、智能助手等)进行部署。
  1. 训练数据与性能
  • LLaMA3:

    • LLaMA 系列模型使用了大量的多语言语料库进行训练,包括新闻、书籍、代码等不同类型的数据。这使得它在多任务场景下具有良好的迁移能力。
    • 预计 LLaMA3 在上下文理解、任务生成和知识问答等方面会进一步提升。
  • ChatGLM:

    • ChatGLM 的训练数据重点在中文和英语语料,特别加强了对中文场景的优化。
    • ChatGLM 在对话流畅度和语境理解方面表现优异,尤其在中文对话任务中的效果比其他许多模型更加自然和一致。
  1. 社区与开源
  • LLaMA3:

    • LLaMA 系列是开源的,特别受到研究人员和开发者的欢迎。其前几个版本广泛应用于研究和学术领域。
    • 社区支持广泛,开发者可以轻松访问和微调这些模型。
  • ChatGLM:

    • ChatGLM 也开源,并且有专门针对中文的开发社区支持。
    • 它的设计更注重轻量化、资源友好型应用,尤其适合想在中文环境中使用 AI 模型的开发者。

技术实现

1. ollama

前往 ollama官网下载对应版本的服务,以下为Windows系统演示

注意:ollama默认是下载到C盘,后期pull大模型也是默认安装在C盘,如果你想修改存储位置,可参考这篇文章,添加系统环境变量来解决

在cmd输入以下命令测试是否安装成功

1
ollama -v

如果安装成功,返回 ollama官网,点击右上角models查询模型

可以看到ollama提供非常多种类的模型,这里我们选择llama3.1(读者可以自行尝试其他模型,使用方法一致)
点击llama3.1进入模型界面

注意: llama3.1提供8B和70B两种数据量的模型,笔者使用的显卡是NVIDIA 4050显存约16G,本地跑llama3.1大模型对电脑配置有一定要求,如非企业需求,个人尝试8B数据量的大模型即可适用

返回命令行,粘贴以下命令

1
ollama run llama3.1

至此,你就可以在本地跑自己的大模型啦
该方法的不足:

  1. 只能在命令行交互,没有提供可视化的交互界面
  2. 本地部署大模型对电脑配置有一定要求
  3. 只能使用原生模型,不能实现模型微调

2.ChatGLM3

笔者曾经尝试本地部署ChatGLM3-6B大模型,遇到以下问题


如果你的操作系统是windows,可能也会遇到类似的问题,即安装相关依赖过程中出现与操作系统冲突的问题
最好的解决办法是在阿里云AutoDL上租用一台服务器(一键解决环境问题)
具体的部署视方法可以参考该视频

3.Llama-factory+Llama3.1

准备工作

  • 支持CUDA的GPU,如果没有,可以自行联系远程服务器
  • Linux bash环境,如果没有,可以使用虚拟机构建
  • 能够连接到huggingface的网络,用于下载模型,如果没有,需要用其他方法下载(如魔塔社区
  • 能够连接github的网络,用于下载github仓库
  • 基础的Linux操作方法
  • 本文基于基于Ubuntu22.04LTS,相关配置如下

使用Anaconda管理包

  • 安装Anaconda
    Anaconda 环境相较于传统的 pip 包管理来说,可以方便快捷地切换不同环境,如果把 pip 比作把所有的文件都摊到桌面上的笨手笨脚管理员, Anaconda 就像把文件归类放进不同文件夹里的爱干净管理员,这样的文件夹在 Anaconda 中称为“环境”。运行不同的程序所需的依赖不同,有时候会出现冲突,同时需要某个包的不同版本,就可以通过设置不同环境,基于某个环境运行不同程序。
    安装Anaconda依赖代码如下

    1
    apt-get install libgl1-mesa-glx libegl1-mesa libxrandr2 libxrandr2 libxss1 libxcursor1 libxcomposite1 libasound2 libxi6 libxtst6

    安装Anaconda安装器

    1
    2
    3
    4
    # 先运行这行
    curl -O https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh
    # 接着是这行
    bash ~/Downloads/Anaconda3-2023.09-0-Linux-x86_64.sh
  • 创建Anaconda环境
    创建一个名为LLaMA的环境,使用python3.11

    1
    2
    conda create -n LLaMA python=3.11
    # 中间会询问你是否 proceed(继续),输入y然后回车即可

    激活这个环境
    注意:在每次重新登陆的时候,必须输入以下命令激活这个环境,因为你在这个环境中安装了依赖项,否则无法找到依赖项

    1
    conda activate LLaMA
  • 安装CUDA
    CUDA 是 NVIDIA 推出的一种软硬件集成技术,我们都知道显卡通常用于进行图像处理,比如电脑上运行的大型3D游戏,它的流畅程度和帧数都很吃 GPU 的水平,GPU 的特点是可以处理大型并法运算,而这种优势和在机器学习等领域非常有用。CUDA 能让我们利用这种 GPU 的这种特点来加速计算,但是 AMD 的显卡不支持这种技术,所以你需要 NVIDIA 的GPU。

接下来我们来安装 CUDA ,首先查看你的显卡支持的 CUDA 版本,在 bash 命令行输入这行代码

1
nvidia-smi 

当前CUDA版本显示在表格最上面的一行,直接前往NVIDIA官网选择对应的操作系统、架构等下载对应的CUDA

  • 安装PyTorch
    PyTorch 是一个 Python 程序库,有助于构建深度学习项目。它非常灵活,并允许我们使用深度学习领域惯用的 Python 来表示深度学习模型。它非常便捷,在刚刚创立的时候就吸引了许多使用者,并且在第 1 次发布之后的几年里,它已经成为应用程序中使用最广泛的深度学习工具之一

    直接前往Pytorch官网选择正确版本并下载

比如我想下载基于linux,pip方法下载python语言,CUDA12.1的就需要运行这行命令

1
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121

(3)安装LLaMA-Factory

  • clone LLaMA-Factory仓库
    选择 LLaMA-Factory 因为它支持目前多种模型,集成了许多方法,支持多种精度,并且有非常易用的 webui 界面,对新手非常友好
    运行以下代码安装LLaMA-Factory

    1
    2
    3
    git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
    cd LLaMA-Factory
    pip install -e ".[torch,metrics]"

    可选的额外依赖项:torch、torch-npu、metrics、deepspeed、bitsandbytes、hqq、eetq、gptq、awq、aqlm、vllm、galore、badam、qwen、modelscope、quality

  • 通过远程机器访问webui
    首先找到LLaMA-Factory/src/llamafactory/webui这个目录,打开interface.py这个文件,将 run_web_ui() 和 run_web_demo() 函数中各自最后一行的launch()函数修改成这样

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def run_web_ui() -> None:
    gradio_share = os.environ.get("GRADIO_SHARE", "0").lower() in ["true", "1"]
    server_name = os.environ.get("GRADIO_SERVER_NAME", "0.0.0.0")
    create_ui().queue().launch(share=gradio_share, server_name=server_name, inbrowser=True,server_port=8887)


    def run_web_demo() -> None:
    gradio_share = os.environ.get("GRADIO_SHARE", "0").lower() in ["true", "1"]
    server_name = os.environ.get("GRADIO_SERVER_NAME", "0.0.0.0")
    create_web_demo().queue().launch(share=gradio_share, server_name=server_name, inbrowser=True,server_port=8887)

    然后,切换到LLaMA-Factory这个目录,运行以下命令(一定要在LLaMA-Factory路径下运行以下命令,否则找不到对应的数据集)

    1
    llamafactory-cli webui

    最后,开放端口,使其能被远程访问。笔者使用的是AutoDL租用的服务器操作,远程连接方法如下图

    注意:share=True表示允许共享,server_port规定了开启的端口,在这里规定为8887,接着就可以通过远程界面访问 webui 了,记得将0.0.0.0替换成远程主机的ip地址,如果无法连接,查看你远程主机的防火墙配置。

如果你成功,恭喜你!现在你可以与自己的大模型进行交互啦

关于本地部署LLaMA3和模型微调的具体操作可参考该视频
关于数据集的格式和内容,笔者在项目过程中也遇到了数据来源匮乏、数据质量不高等一系列复杂问题,以下是参考范例和最终效果展示

大模型结合知识图谱

1.Maxkb+ollama打造本地知识库

具体方法可参考该视频
以及Maxkb操作手册

效果如下

2.AnythingLLM+Ollama

具体方法可参考该视频
以及anythingLLA官网

效果如下

AnythingLLA将提供的文本文档向量化存储在此岸连数据库中,调用时将会检索向量数据库并通过链接成自然语言返回给用户

3.Langchain+llama

具体方法可参考该视频


后记

该项目启动于2024年七月中下旬,依稀记得在那个炎热的暑假,我怀着炽热的心,满怀激情地进入了项目组,期待着和学长学姐一起在项目中学习成长。
从最初搭建fay框架的数字人,到立项有明确的任务分工,再到技术路线的调研,模型的选型、部署和微调,一步一步走过来,我收获了很多很多,不仅仅有未知的知识和技能,还有深厚的感情和独特的体验。在此特别感谢陈院长给予的宝贵机会,感谢白学姐给我指导和帮助,感谢小伙伴的陪伴。这是一段浅浅的科研体验,也是一段非常独特的人生体验,好似在我平凡的暑假生活中点亮了一盏灯,指引着我前进。最后,再次衷心感谢这三个月以来老师、学姐和小伙伴的支持与陪伴!