LoginSignup
5
6

LangServe×Ollamaを使ってローカルPCでLLMサーバーを立ち上げてみる

Last updated at Posted at 2024-05-01

はじめに

LangServeはLangChainをREST APIとしてデプロイするのに役立つツールです。LangServeはFastAPIで構築されており、pydanticによる検証が可能です。(公式日本語訳)

今回は技術調査も兼ねてLangServeでLLMサーバーを立ち上げ、特徴について記事にまとめます。

使用技術は以下です。

  • LangChain
  • LangServe
  • Ollama
  • FastAPI
  • (LangSmith)

API使用料などかからず、全て無料でできます。

N番煎じの内容ですが、ご容赦ください🙇‍♂️

環境構築

まずはじめに仮想環境へライブラリをインストールします。

(仮想環境)$ pip install langchain "langserve[all]" fastapi pydantic==1.10.13

次にローカルPCでLLMサーバーを立ち上げるということで、Ollamaをダウンロードします。

スクリーンショット 2024-05-01 9.57.16.png

ダウンロードしたら、Ollamaの指示通りにインストールまで行ってください。

今回はOllamaを用いてLlama3の8Bを使ってみます。

CLIで以下のようにllama3を事前にpullしておきます。

% ollama pull llama3

他モデルの情報は以下です。(公式のGitHubのREADMEから転用)

Model Parameters Size Download
Llama 3 8B 4.7GB ollama run llama3
Llama 3 70B 40GB ollama run llama3:70b
Phi-3 3.8B 2.3GB ollama run phi3
Mistral 7B 4.1GB ollama run mistral
Neural Chat 7B 4.1GB ollama run neural-chat
Starling 7B 4.1GB ollama run starling-lm
Code Llama 7B 3.8GB ollama run codellama
Llama 2 Uncensored 7B 3.8GB ollama run llama2-uncensored
LLaVA 7B 4.5GB ollama run llava
Gemma 2B 1.4GB ollama run gemma:2b
Gemma 7B 4.8GB ollama run gemma:7b
Solar 10.7B 6.1GB ollama run solar

公式からの目安として、7Bのモデルは8GBのRAM、13Bのモデルは16GBのRAM、33Bのモデルは32GBのRAMが必要です。

Ollamaのモデルライブラリにもう少し詳しい情報がまとまっています。

LangServe×Ollamaを使ってローカルPCでLLMサーバーを立ち上げるプログラム

LangServe×Ollamaを使ってローカルPCでLLMサーバーを立ち上げるプログラムは以下です。

main.py
from fastapi import FastAPI
from langchain_community.llms import Ollama
from langserve import add_routes

app = FastAPI(
    title="LangChain Server",
    version="1.0",
    description="A simple api server using Langchain's Runnable interfaces",
)

add_routes(
    app,
    Ollama(model="llama3"),
    path="/chat",
)

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="localhost", port=8000)

使い方について

サーバーの立ち上げ

$ python main.py

上記でhttp://localhost:8000/にサーバーが立ち上がります。

ドキュメント

http://localhost:8000/docsにアクセスすればAPI一覧が確認可能です。
 
スクリーンショット 2024-04-30 17.12.55.png

ちなみにSwaggerの「Try it out」を押せば簡単にテストできます。(POSTメソッドの時はパラメータを適宜入力してください。)

スクリーンショット 2024-05-01 10.14.36.png

FastAPIでアプリを立ち上げているので、http://localhost:8000/redocでも確認可能です。

スクリーンショット 2024-04-30 17.25.11.png

curlコマンド

ローカルLLMをAPIとして使う場合、例えばcurlコマンドを用いて以下のように使います。

curl -X 'POST' \
  'http://localhost:8000/chat/invoke' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "input": "好きなメッセージを入れてください",
  "config": {},
  "kwargs": {}
}'

playground

http://localhost:8000/{設定したパス}/playground/にアクセスすれば、Chat形式のUI上で簡易的なテストが可能です。

スクリーンショット 2024-04-30 17.17.40.png

ちなみに回答は以下のように得られます。

スクリーンショット 2024-04-30 17.17.06.png

LangServeの特徴

先述したFastAPIとpydanticとの関連については除いて特徴を記述します。

ローコードで構築が可能

LangServeを使えば少ないコード記述量でサーバーを構築できます。

またドキュメントで確認しましたが、デフォルトでAPIが複数設定されていることがわかります。(注: APIは本数が多ければ多いというわけではありませんが。)

LangServeを使用しない場合は、FastAPIのAPIRouterを用いてルーティングを定義する必要があるなど、コード記述量が増えてしまいます。(一方で詳細かつ厳密なコーデングが要求される場合は、どちらを用いるべきかを精査する必要があります。)

LangSmithとの接続が容易

LangSmithとはLangChain運用時の便利ツールであり、LLMのトークン数や出力、レイテンシなどを確認することができます。

LangSmithの使用には、API Keyが必要です。

以下リンクからアカウントを作成してAPI Keyを取得します。

スクリーンショット 2024-05-01 10.35.55.png

API Keyを取得したら以下のように環境変数に入れてください。

export LANGCHAIN_TRACING_V2="true"
export LANGCHAIN_API_KEY="..." //API Key

次にプロジェクト名(プロジェクトとは、ここではLLMとの履歴を保存するためのもの)は環境変数のLANGCHAIN_PROJECTで設定します。

export LANGCHAIN_PROJECT="..." //プロジェクト名

uuidやulidを用いてプロジェクト名を設定したい場合は以下のようにプログラムで設定すると良いです。

import os

# uuidもしくulidの例
## uuid 
from uuid import uuid4
unique_id = uuid4().hex[:12]

## ulid: 事前にpip install python-ulid
from ulid import ULID 
unique_id = ULID().hex[:12]

os.environ["LANGCHAIN_PROJECT"] = f"Tracing Walkthrough - {unique_id}"

正しく設定が完了したのちに、ローカルPCで立ち上げたLLMサーバーにAPIを送ってみてください。(UIからでもなんでも大丈夫です。)

以下のようにLangSmithに応答履歴が保存されているはずです。

スクリーンショット 2024-05-01 10.38.43.png

おわりに

LangServe×Ollamaを使ってローカルPCでLLMサーバーを立ち上げてみるという内容でした。

全て無料なので、ぜひ試してみてください。

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6