简介

如今 AI 领域的技术革新进行的如火如茶,诞生了很多新兴的项目,例如本文用到的 Dify 以及用于在本地部署大模型服务的 Ollama

这两个项目可以让你零成本的在本地实现 RAG,以及基于知识库上下文的聊天问答。

系统要求

目前 Ollama 的 Windows 版尚处于 Preview 状态中,建议在 Apple M 系列处理器的电脑上运行,或者有 GPU 的 Linux Server。

最新的 llama3.2 对内存要求较上一代少了些,同时模型质量保持与 llama3.1 相当。据说是 2G+ 就可以了,甚至可以运行在一些移动设备上!

获取模型

访问 Ollama 官网下载对应系统的 App,该 App 中包含 CLI 工具,然后再访问 Models,查看需要使用的模型,我这里使用的是最新的 llama3.2,以及 mxbai-embed-large

模型的用途:

  • llama3.2: 主要用于 Chat 文本生成
  • mxbai-embed-large: 对文档进行 Embedding 操作

安装完成后查看 Ollama 的对应版本,有些模型对版本有特殊要求!

ollama -v
ollama version is 0.3.12
ollama pull llama3.2
ollama pull mxbai-embed-large

运行 Ollama 服务

运行 Ollama 服务的方式有两种,一种是直接打开 Ollama 的 App,另一种则是通过 CLI 来启动,当 App 运行后,CLI 就无法在运行了,因为这将导致服务绑定的端口冲突。

ollama serve --help
Start ollama

Usage:
  ollama serve [flags]

Aliases:
  serve, start

Flags:
  -h, --help   help for serve

Environment Variables:
      OLLAMA_DEBUG               Show additional debug information (e.g. OLLAMA_DEBUG=1)
      OLLAMA_HOST                IP Address for the ollama server (default 127.0.0.1:11434)
      OLLAMA_KEEP_ALIVE          The duration that models stay loaded in memory (default "5m")
      OLLAMA_MAX_LOADED_MODELS   Maximum number of loaded models per GPU
      OLLAMA_MAX_QUEUE           Maximum number of queued requests
      OLLAMA_MODELS              The path to the models directory
      OLLAMA_NUM_PARALLEL        Maximum number of parallel requests
      OLLAMA_NOPRUNE             Do not prune model blobs on startup
      OLLAMA_ORIGINS             A comma separated list of allowed origins
      OLLAMA_SCHED_SPREAD        Always schedule model across all GPUs
      OLLAMA_TMPDIR              Location for temporary files
      OLLAMA_FLASH_ATTENTION     Enabled flash attention
      OLLAMA_LLM_LIBRARY         Set LLM library to bypass autodetection
      OLLAMA_GPU_OVERHEAD        Reserve a portion of VRAM per GPU (bytes)
      OLLAMA_LOAD_TIMEOUT        How long to allow model loads to stall before giving up (default "5m")

可以看到 Ollama 的服务支持通过 ENV 的方式去配置启动参数,这里建议设置如下环境变量:

  • OLLAMA_HOST=“0.0.0.0”
  • OLLAMA_ORIGINS="*"
  • OLLAMA_KEEP_ALIVE=“24h”
OLLAMA_HOST="0.0.0.0" OLLAMA_ORIGINS="*" OLLAMA_KEEP_ALIVE="24h" ollama serve
2024/09/29 12:37:38 routes.go:1153: INFO server config env="map[HTTPS_PROXY: HTTP_PROXY: NO_PROXY: OLLAMA_DEBUG:false OLLAMA_FLASH_ATTENTION:false OLLAMA_GPU_OVERHEAD:0 OLLAMA_HOST:http://0.0.0.0:11434 OLLAMA_KEEP_ALIVE:24h0m0s OLLAMA_LLM_LIBRARY: OLLAMA_LOAD_TIMEOUT:5m0s OLLAMA_MAX_LOADED_MODELS:0 OLLAMA_MAX_QUEUE:512 OLLAMA_MODELS:/Users/George/.ollama/models OLLAMA_NOHISTORY:false OLLAMA_NOPRUNE:false OLLAMA_NUM_PARALLEL:0 OLLAMA_ORIGINS:[* http://localhost https://localhost http://localhost:* https://localhost:* http://127.0.0.1 https://127.0.0.1 http://127.0.0.1:* https://127.0.0.1:* http://0.0.0.0 https://0.0.0.0 http://0.0.0.0:* https://0.0.0.0:* app://* file://* tauri://*] OLLAMA_SCHED_SPREAD:false OLLAMA_TMPDIR: http_proxy: https_proxy: no_proxy:]"
time=2024-09-29T12:37:38.522+08:00 level=INFO source=images.go:753 msg="total blobs: 17"
time=2024-09-29T12:37:38.523+08:00 level=INFO source=images.go:760 msg="total unused blobs removed: 0"
time=2024-09-29T12:37:38.523+08:00 level=INFO source=routes.go:1200 msg="Listening on [::]:11434 (version 0.3.12)"
time=2024-09-29T12:37:38.524+08:00 level=INFO source=common.go:135 msg="extracting embedded files" dir=/var/folders/p6/g0wwf37d165dfg5hvqtr9l180000gn/T/ollama966569504/runners
time=2024-09-29T12:37:38.547+08:00 level=INFO source=common.go:49 msg="Dynamic LLM libraries" runners=[metal]
time=2024-09-29T12:37:38.577+08:00 level=INFO source=types.go:107 msg="inference compute" id=0 library=metal variant="" compute="" driver=0.0 name="" total="48.0 GiB" available="48.0 GiB"

服务启动后,可以使用如下命令查看 Ollama 中现有的模型列表:

curl http://127.0.0.1:11434/api/tags | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1391  100  1391    0     0   614k      0 --:--:-- --:--:-- --:--:--  679k
{
  "models": [
    {
      "name": "llama3.2:latest",
      "model": "llama3.2:latest",
      "modified_at": "2024-09-28T21:00:44.510551673+08:00",
      "size": 2019393189,
      "digest": "a80c4f17acd55265feec403c7aef86be0c25983ab279d83f3bcd3abbcb5b8b72",
      "details": {
        "parent_model": "",
        "format": "gguf",
        "family": "llama",
        "families": [
          "llama"
        ],
        "parameter_size": "3.2B",
        "quantization_level": "Q4_K_M"
      }
    },
    {
      "name": "mxbai-embed-large:latest",
      "model": "mxbai-embed-large:latest",
      "modified_at": "2024-07-04T16:35:42.71585157+08:00",
      "size": 669615493,
      "digest": "468836162de7f81e041c43663fedbbba921dcea9b9fefea135685a39b2d83dd8",
      "details": {
        "parent_model": "",
        "format": "gguf",
        "family": "bert",
        "families": [
          "bert"
        ],
        "parameter_size": "334M",
        "quantization_level": "F16"
      }
    }
  ]
}

运行模型

ollama run llama3.2
>>> Send a message (/? for help)

运行上述命令后就成功运行 LLM 了,如果需要退出交互式命令行,可以使用快捷键 Ctrl + D 或者输入 /bye 退出。

退出后使用如下命令查看正在运行的模型:

ollama ps
NAME               ID              SIZE      PROCESSOR    UNTIL
llama3.2:latest    a80c4f17acd5    4.0 GB    100% GPU     24 hours from now

注意:Text Embedding 模型不需要使用 run 命令手动运行,当模型 Pull 下来以后,Ollama 服务启动后,可以直接访问 API 调用 Text Embedding 模型!

尝试调用 Ollama 的 Text Embedding API:

curl http://127.0.0.1:11434/api/embed -d '{
  "model": "mxbai-embed-large",
  "input": "Why is the sky blue?"
}' | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 12889    0 12820  100    69   214k   1183 --:--:-- --:--:-- --:--:--  217k
{
  "model": "mxbai-embed-large",
  "embeddings": [
    [
      -0.010455716,
      -0.0025081504,
      0.014609501,
      .....
      -0.004249276,
      -0.010569806,
      -0.00813636
    ]
  ],
  "total_duration": 57530917,
  "load_duration": 708625,
  "prompt_eval_count": 6
}

在通过 API 调用 Text Embedding 模型后,模型将被 Ollama 自动载入,此时在运行 ps 命令查看时将得到如下结果:

ollama ps
NAME                        ID              SIZE      PROCESSOR    UNTIL
mxbai-embed-large:latest    468836162de7    1.2 GB    100% GPU     24 hours from now
llama3.2:latest             a80c4f17acd5    4.0 GB    100% GPU     24 hours from now

总结

到这里本地部署模型已经完成了,接下来就是在 Dify 中使用 Ollama 中运行的 LLM 和 Text Embedding 模型配置自己的 RAG 应用了。

除了上述模型,你可以自行尝试其他模型,AI 领域的东西迭代的太快了,也许几天后又出了新的模型,降低资源占用的同时提升了模型质量。

我们能做的就是持续学习,紧跟前沿动态!

I hope this is helpful, Happy hacking…