Open13

ローカルLLM Ollama をUbuntuで動かす

k8shirok8shiro

とりあえず何を使ってローカルLLM環境を作るか

  • 候補
    • Ollama
    • LM Studio
    • Llama.cpp
    • GPT4All
    • text-generation-webui

今回はOllamaを選択
メジャー・情報多そう
Ubuntu(GUIなし)で起動したい
できればDockerで起動したい
n8nから連携しようとしたときにノードが用意されている
あたりの理由

WindowsでUIベースで使うならLM Studio
Web UIで操作するならtext-generation-webuiという選択肢もある

k8shirok8shiro

https://hub.docker.com/r/ollama/ollama

OllamaはDockerで起動するようなのでしてみる
CPU Onlyで起動
docker composeで起動できるようにする

version: '3.8'

services:
  ollama:
    image: ollama/ollama
    container_name: ollama
    ports:
      - "11434:11434"
    volumes:
      - ./ollama_data:/root/.ollama
    restart: always
k8shirok8shiro

使用可能なモデルは以下で見れる
https://github.com/ollama/ollama?tab=readme-ov-file#model-library
https://ollama.com/library

llama3がCPUだけで動きそうで一般的、日本語も大丈夫そう

$ docker compose exec -it ollama ollama run llama3
WARN[0000] /home/kohei/Git/ollama_docker/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion 
pulling manifest 
pulling 6a0746a1ec1a: 100% ▕██████████████████████▏ 4.7 GB                         
pulling 4fa551d4f938: 100% ▕██████████████████████▏  12 KB                         
pulling 8ab4849b038c: 100% ▕██████████████████████▏  254 B                         
pulling 577073ffcc6c: 100% ▕██████████████████████▏  110 B                         
pulling 3f8eb4da87fa: 100% ▕██████████████████████▏  485 B                         
verifying sha256 digest 
writing manifest 
success 
>>> こんにちは
こんにちは!😊 How are you today?

実行すると4.7GBのモデルをダウンロードが始まり、終わると対話ができるようになる

k8shirok8shiro

とりあえずAPIなら以下で回答を受け取れる

curl http://localhost:11434/api/generate -d '{
  "model": "llama3",
  "prompt": "猫について教えてください。",
  "stream": false
}'
k8shirok8shiro

Slack + n8n + OllamaでChatGPT風に動くようにしてみる
Slackのbot設定は以下を参考

https://qiita.com/odm_knpr0122/items/04c342ec8d9fe85e0fe9

k8shirok8shiro

権限は以下
chat:write
groups:history(パブリックチャンネルでやるなら channels:history)
groups:read
channels:read (n8nからチャンネルを選択するのに必要)

k8shirok8shiro

Event Subscriptionsも設定しないとできないが、n8nローカル実行ではRequest URLを指定できないのでn8nでpostを拾えない

k8shirok8shiro

とりあえずLibreChatから使えるようにしてみる
https://github.com/danny-avila/LibreChat

k8shirok8shiro

リポジトリをcloneしてもよいが、docker-compose.ymlと.env.exampleから作った.envで起動できそう

k8shirok8shiro

起動したらブラウザからアクセス
適当なユーザーを作ってアクセス

k8shirok8shiro

以下のlibrechat.yaml
でOllamaが使えるようになった

version: 1.2.1
endpoints:
  custom:
    - name: "Ollama"
      apiKey: "ollama"
      baseURL: "http://<ホストIP>:11434/v1/"
      models:
        default: [
          "llama3"
        ]
        fetch: false # fetching list of models is not supported
      titleConvo: true
      titleModel: "current_model"
      summarize: false
      summaryModel: "current_model"
      forcePrompt: false
      modelDisplayLabel: "Ollama"
      addParams:
          "stop": [
              "<|start_header_id|>",
              "<|end_header_id|>",
              "<|eot_id|>",
              "<|reserved_special_token"
          ]

https://www.librechat.ai/docs/configuration/librechat_yaml/ai_endpoints/ollama
を参考に llama3の使用に注釈から上記addParamsの設定を入れている

k8shirok8shiro

LibreChatはdocker composeで起動している

# Do not edit this file directly. Use a ‘docker-compose.override.yaml’ file if you can.
# Refer to `docker-compose.override.yaml.example’ for some sample configurations.

services:
  api:
    container_name: LibreChat
    ports:
      - "${PORT}:${PORT}"
    depends_on:
      - mongodb
      - rag_api
    image: ghcr.io/danny-avila/librechat-dev:latest
    restart: always
    user: "${UID}:${GID}"
    extra_hosts:
      - "host.docker.internal:host-gateway"
    environment:
      - HOST=0.0.0.0
      - MONGO_URI=mongodb://mongodb:27017/LibreChat
      - MEILI_HOST=http://meilisearch:7700
      - RAG_PORT=${RAG_PORT:-8000}
      - RAG_API_URL=http://rag_api:${RAG_PORT:-8000}
    volumes:
      - type: bind
        source: ./librechat.yaml
        target: /app/librechat.yaml
      - type: bind
        source: ./.env
        target: /app/.env
      - ./images:/app/client/public/images
      - ./uploads:/app/uploads
      - ./logs:/app/api/logs
  mongodb:
    container_name: chat-mongodb
    image: mongo
    restart: always
    user: "${UID}:${GID}"
    volumes:
      - ./data-node:/data/db
    command: mongod --noauth
  meilisearch:
    container_name: chat-meilisearch
    image: getmeili/meilisearch:v1.12.3
    restart: always
    user: "${UID}:${GID}"
    environment:
      - MEILI_HOST=http://meilisearch:7700
      - MEILI_NO_ANALYTICS=true
      - MEILI_MASTER_KEY=${MEILI_MASTER_KEY}
    volumes:
      - ./meili_data_v1.12:/meili_data
  vectordb:
    container_name: vectordb
    image: ankane/pgvector:latest
    environment:
      POSTGRES_DB: mydatabase
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
    restart: always
    volumes:
      - pgdata2:/var/lib/postgresql/data
  rag_api:
    container_name: rag_api
    image: ghcr.io/danny-avila/librechat-rag-api-dev-lite:latest
    environment:
      - DB_HOST=vectordb
      - RAG_PORT=${RAG_PORT:-8000}
    restart: always
    depends_on:
      - vectordb
    env_file:
      - .env

volumes:
  pgdata2:

https://github.com/danny-avila/LibreChat
のリポジトリのdocker-compose.ymlをベースに

    volumes:
      - type: bind
        source: ./librechat.yaml
        target: /app/librechat.yaml

の設定を追加している