前言

在人工智能迅猛发展的时代,构建和优化大语言模型(LLM)已成为技术前沿的重要课题。本篇文章将带您深入探索如何利用Ollama和anythingLLM,打造一个支持自定义知识库的本地大模型。本文包含Ollama和anythingLLM的安装与配置过程,编写高效prompt的技巧,并提供逐步指导,确保您能够顺利完成安装和配置。
与云端模型相比,本地部署能够显著降低响应时间,提升用户体验。同时,本地化处理数据可以更好地保护用户隐私,避免敏感信息外泄。此外,文章还涵盖了自定义训练模型的基本步骤和参考资料,旨在为您提供实用的应用指南,而非晦涩难懂的理论知识。不论您是初学者还是资深开发者,都能从中汲取有价值的信息和灵感,助力您的项目迈向成功。

一、部署

1.1 ollama介绍与安装

Ollama 是一个开源的 AI 工具(官网GitHub(ollama)),允许用户在本地运行大型语言模型(LLM)。Ollama 提供了一个轻量级、可扩展的框架,支持在 macOS 和 Linux 系统上运行,并计划未来支持 Windows。用户可以轻松下载和运行预构建的模型,如 Llama 3.1 和 Mistral。此外,Ollama 还支持从 GGUF、PyTorch 或 Safetensors 导入模型,允许用户根据具体需求进行定制。总之,Ollama 为开发者和研究人员提供了一个强大的平台,能够在本地环境中高效地利用大型语言模型。

点击查看:ollama cpu和gpu版本的硬件要求

CPU 版

1. 性能:CPU 版适用于没有 GPU 或 GPU 资源有限的环境。虽然可以运行大型语言模型,但速度相对较慢,尤其是在处理复杂任务时。
2. 硬件要求:需要高性能的多核处理器(如 Intel Xeon 或 AMD Ryzen),并且通常需要较大的系统内存(至少 32 GB)⁴。 3. 适用场景:适合开发、测试和小规模部署。

GPU 版

1. 性能:GPU 版利用 GPU 的并行计算能力,大幅提升模型运行速度。即使是入门级的 GPU(如 NVIDIA RTX 3050),也能显著快于 CPU。
2. 硬件要求:需要支持 CUDA 的 NVIDIA GPU(如 RTX 3080 或更高),显存容量通常在 10GB 到 24GB 之间²。未来计划支持 AMD GPU。
3. 适用场景:适合大规模部署和高性能计算任务,如实时推理和大数据处理。

Ollama 支持在 macOS、Linux 和 Windows 平台上运行。以下是各平台的安装方式:

macOS

  1. 下载:从 Ollama 官方网站下载 macOS 版本的安装包。
  2. 安装:双击下载的安装包并按照提示进行安装。
  3. 运行:打开终端,输入 ollama run qwen2

Linux

  1. 下载:在终端中运行以下命令下载并安装 Ollama:
    curl -fsSL https://ollama.com/install.sh | sh
  2. 配置:确保已安装并配置好 GPU 驱动程序(如果需要)。
  3. 运行:在终端中输入 ollama run llama3.1 以运行模型。

Windows

  1. 下载:从 Ollama 官方网站下载 Windows安装包。
  2. 安装:双击安装包并按照提示进行安装。
  3. 配置:确保 GPU 驱动程序是最新的。
  4. 运行:打开命令提示符,输入 ollama run qwen2

docker

此外 Ollama 还支持 Docker。可以使用官方的 Docker 镜像来运行 Ollama,这使得在不同平台上部署和管理大型语言模型变得更加简单。

点击查看:使用 Docker 运行 Ollama 的步骤

CPU 版本

1. 拉取镜像:
docker pull ollama/ollama
2. 运行容器:
docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama

Nvidia GPU 版本

1. 安装 Nvidia 容器工具包:
sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker
2. 拉取镜像并运行容器:
docker run -d --gpus=all -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama

AMD GPU 版本

使用 ROCm 标签运行:
docker run -d --device /dev/kfd --device /dev/dri -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama:rocm

1.2 ollama的配置与启动

Linux版执行完命令后即可通过ollama命令。
61655-f36jlib7ttd.png
Ollama在Linux上可以通过systemd管理,如需要配置监听端口、配置代理,可以在/etc/systemd/system/ollama.service中添加相应配置。
33894-a309rbd7wn.png
启动和停止Ollama服务:

sudo systemctl start ollama
sudo systemctl stop ollama

windows版的Ollama在安装完成后,会自动弹出一个命令行,此时按照提示运行命令即可快速拉取并启动一个本地大模型。
60433-kjsymksdutl.png

1.3 部署与运行模型

以windows系统为例:
执行ollama run llama3.1拉取并本地运行llama3.1,其他支持的模型列表:ollama.com/library
91853-78xdaqqzrzc.png
96645-4ua1gdztlov.png
77173-4v8g444hfd5.png
至此,如果您能接受通过命令行和大模型交流,并且也不需要自定义知识库,您的本地大模型已部署完成~

二、配置与使用

2.1 使用Modefile创建定制模型

在 Ollama 中,Modelfile 是一个配置文件,用于定义和管理模型的行为和特性。通过 Modelfile,你可以创建新模型或修改现有模型,以满足特定的应用需求。以下是关于 Modelfile 的详细介绍以及如何使用它创建模型的步骤:

什么是 Modelfile?

Modelfile 包含以下主要部分:

  1. 基础模型引用:定义新模型所基于的基础模型。
  2. 参数:设置模型运行时的参数,如温度(temperature)、top_k 和 top_p 等。
  3. 模板:定义传递给模型的完整提示模板。
  4. 系统消息:指定系统的整体行为。
    完整的介绍参考官方文档:ModelFile介绍

创建 Modelfile 的步骤

1. 创建一个新的 Modelfile

使用你喜欢的文本编辑器创建一个名为 CatModelfile 的文件,并添加以下内容:

FROM llama3.1:latest

TEMPLATE """
[INST] <>{{ .System }}<>
{{ .Prompt }} [/INST]
"""

PARAMETER temperature 1.0
PARAMETER top_k 100
PARAMETER top_p 1.0
PARAMETER stop "[INST]"
PARAMETER stop "[/INST]"
PARAMETER stop "<>"
PARAMETER stop "<>"

SYSTEM """
你是一只会说话的猫,回答问题之前都会喵一声。
"""

2. 使用 Modelfile 创建新模型

在终端中运行以下命令来创建新模型:

ollama create catllama -f CatModelfile

3. 运行新创建的模型

使用以下命令运行新模型:

ollama run catllama

22974-3692bzqkame.png

2.2 使用rest api与模型进行对话

使用 REST API 可以方便地与 Ollama 模型进行对话。以下是如何使用 REST API 与 Ollama 模型交互的步骤:

1. 启动 Ollama 服务

确保 Ollama 服务在本地运行(windows默认后台运行,Linux可通过ollama serve&启动后台服务),并监听默认端口 11434

2. 发送请求

使用 curl 或其他 HTTP 客户端(如 Postman)发送请求。以下是一个使用 curl 的示例:

示例请求

curl -X POST http://localhost:11434/api/generate -d '{
  "model": "llama3.1",
  "prompt": "你好,Ollama!",
  "stream": false
}'

请求参数

  • model:模型名称(如 llama3.1)。
  • prompt:要生成响应的提示。
  • stream:如果设置为 false,响应将作为单个对象返回;如果设置为 true,响应将作为对象流返回。

3. 处理响应

响应将是一个 JSON 对象,包含模型生成的文本。例如:

{
  "model": "llama3.1",
  "created_at": "2024-09-17T12:46:23Z",
  "response": "你好!有什么我可以帮助你的吗?",
  "done": true
}

4. 高级参数

你可以在请求中添加更多参数来控制模型的行为,例如:

  • temperature:控制生成文本的随机性。
  • top_k:限制每次预测时考虑的最高概率的词数。
  • top_p:使用核采样方法,控制生成文本的多样性。

示例请求(带高级参数)

curl -X POST http://localhost:11434/api/generate -d '{
  "model": "llama3.1",
  "prompt": "解释一下量子力学。",
  "temperature": 0.7,
  "top_k": 50,
  "top_p": 0.9,
  "stream": false
}'

通过这些步骤,即可通过 REST API 与 Ollama 模型进行对话,其他完整的api接口可以参考:Ollama API

三、优化

3.1 prompt的定义与优化

什么是 Prompt?

在人工智能(AI)领域,prompt 是指用户提供给模型的输入文本,用于引导模型生成特定的输出。它可以是一个问题、一段描述、或一组指令,目的是让模型理解用户的意图并生成相应的响应。

一个好的 Prompt 应该包含哪些内容?

  1. 明确的目标

    • 清晰地表达你希望模型完成的任务。例如:“请生成一篇关于环境保护的文章。”
  2. 具体的要求

    • 提供详细的指令和期望。例如:“请生成一篇关于环境保护的文章,长度为500字,包含三个主要观点。”
  3. 上下文信息

    • 提供必要的背景信息,以帮助模型更好地理解任务。例如:“假设你是一名环境科学家,解释为什么减少塑料使用对海洋生态系统很重要。”
  4. 格式和结构

    • 指定输出的格式和结构。例如:“请生成一篇包含引言、三个主要观点和结论的文章。”
  5. 关键词

    • 使用关键词来强调重要的概念或主题。例如:“请在文章中使用‘可持续发展’、‘塑料污染’和‘海洋保护’等关键词。”
  6. 示例

    • 提供示例以帮助模型理解你的期望。例如:“例如:‘减少塑料使用可以显著降低海洋污染,保护海洋生物的生存环境。’”

示例 Prompt

请生成一篇关于环境保护的文章,长度为500字,包含三个主要观点。假设你是一名环境科学家,解释为什么减少塑料使用对海洋生态系统很重要。请在文章中使用‘可持续发展’、‘塑料污染’和‘海洋保护’等关键词。文章应包含引言、三个主要观点和结论。例如:‘减少塑料使用可以显著降低海洋污染,保护海洋生物的生存环境。’

通过包含这些要素,你可以创建一个清晰、具体且有效的 prompt,从而获得更符合预期的模型输出。

3.2 通过配置文件参数优化模型内存占用

优化 Ollama 模型的资源占用可以通过多种方法实现,以下是一些常见的优化策略:

1. 调整 GPU 层数

通过调整模型加载到 GPU 的层数,可以有效减少显存占用。你可以在 Modelfile 中添加 num_gpu 参数来指定加载到 GPU 的层数。例如:

PARAMETER num_gpu 5

这将限制模型加载到 GPU 的层数,从而减少显存占用¹²。

2. 使用混合模式

Ollama 支持 CPU 和 GPU 的混合模式运行。在显存不足的情况下,可以部分使用 CPU 来分担计算任务。你可以在运行模型时指定混合模式:

ollama run llama3.1 --use-cpu

3. 调整模型参数

通过调整模型的其他参数,如 temperaturetop_ktop_p,可以优化模型的计算效率和资源占用。例如:

PARAMETER temperature 0.7
PARAMETER top_k 50
PARAMETER top_p 0.9

这些参数可以在 Modelfile 中设置,以优化模型的生成过程。

4. 使用统一内存

如果显存不足,可以使用 CUDA 的统一内存(Unified Memory)来补充显存。这允许 GPU 和 CPU 共享内存空间,从而提高内存利用率。

5. 设置环境变量

通过设置环境变量,可以控制模型在内存中的保留时间。例如,使用 OLLAMA_KEEP_ALIVE 环境变量来设置模型在内存中的保留时间:

export OLLAMA_KEEP_ALIVE=3600  # 保留时间为3600秒

这可以减少频繁加载模型带来的开销。

四、进阶

4.1 使用AnythingLLM给大模型投喂知识库

AnythingLLM 是由 Mintplex Labs Inc. 开发的一个开源、可定制的企业级文档聊天机器人解决方案。以下是它的主要特点和细节:

主要特点

  • 多用户支持和权限管理:允许多个用户同时使用,并可设置不同的权限。
  • 支持多种文档类型:包括 PDF、TXT、DOCX 等。
  • 简易的文档管理界面:通过用户界面管理向量数据库中的文档。
  • 多种聊天模式:对话模式保留之前的问题和回答,查询模式则是简单的针对文档的问答。
  • 信息来源追踪:聊天过程中会提供引用的文档内容,方便追溯信息来源,增强结果可信度。
  • 多种部署方式:支持 100% 云部署,也支持本地部署,满足不同用户的需求。
  • 自定义 LLM 模型:可以使用您自己的 LLM 模型,定制化程度更高,满足个性化需求。
  • 高效处理大型文档:相较于其他文档聊天机器人解决方案,AnythingLLM 在处理大型文档时效率更高,成本更低,最多可节省 90% 的成本。
  • 开发者友好:提供全套开发者 API,方便自定义集成,扩展性更强。

支持 RAG(Retrieval-Augmented Generation)

AnythingLLM 支持 RAG(检索增强生成)。RAG 是一种结合检索和生成的技术,通过从外部知识库中检索相关信息并将其融入生成的文本中,从而提高模型的回答准确性和相关性。这对于需要结合大量外部数据进行回答的应用场景非常有用。

对话模式和查询模式的区别

  • 对话模式:在对话模式中,系统会保留之前的问题和回答,使用户能够进行更连贯、深入的对话。这种模式适用于需要上下文记忆的复杂对话场景。
  • 查询模式:在查询模式中,系统专注于根据用户指定的文件进行简单的问答聊天。每个聊天回复还包含指向原始内容的引用链接,使用户能够方便地查看来源。

通过这些功能,AnythingLLM 提供了一个强大且灵活的平台,适用于各种企业级应用场景。

如何给anythingLLM上传知识库

点击上传图标:
88690-3138ko1nwhe.png
上传文档,并移动到工作区并保存:
22488-yy5ofneq7f.png
开始基于上传的文档或网页对话:
15336-fszfjf7m9dd.png

API 调用示例

1. 获取 API 密钥

首先,你需要获取一个 API 密钥。可以在 AnythingLLM 的用户界面中生成和管理 API 密钥。

2. 发送请求

使用 curl 或其他 HTTP 客户端(如 Postman)发送请求。以下是一个使用 curl 的示例:

示例请求:上传文档
curl -X POST http://localhost:3001/api/documents/upload \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "file=@/path/to/your/document.pdf"
示例请求:进行问答
curl -X POST http://localhost:3001/api/chat \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "llama3.1",
    "prompt": "根据上传的文档回答以下问题:什么是量子力学?",
    "stream": false
  }'

完整的 API 接口文档

你可以在本地运行的 AnythingLLM 实例上访问完整的 API 文档。以下是访问方法:

  1. 启动 AnythingLLM 服务:确保服务在本地运行。
  2. 访问 API 文档:打开浏览器,访问 http://localhost:3001/api/docs。这里你可以找到所有可用端点的详细说明和示例。

主要 API 端点

  • 上传文档

    • 端点POST /api/documents/upload
    • 描述:上传文档到指定的工作区。
    • 参数
      • file:要上传的文件。
  • 进行问答

    • 端点POST /api/chat
    • 描述:根据指定的模型和提示进行问答。
    • 参数
      • model:模型名称(如 llama3.1)。
      • prompt:生成响应的提示。
      • stream:是否以流式返回响应。

4.2 自定义训练基本步骤及参考资料

llm-cookbook