はじめに
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をダウンロードします。
ダウンロードしたら、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サーバーを立ち上げるプログラムは以下です。
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一覧が確認可能です。
ちなみにSwaggerの「Try it out」を押せば簡単にテストできます。(POSTメソッドの時はパラメータを適宜入力してください。)
FastAPIでアプリを立ち上げているので、http://localhost:8000/redoc
でも確認可能です。
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上で簡易的なテストが可能です。
ちなみに回答は以下のように得られます。
LangServeの特徴
先述したFastAPIとpydanticとの関連については除いて特徴を記述します。
ローコードで構築が可能
LangServeを使えば少ないコード記述量でサーバーを構築できます。
またドキュメントで確認しましたが、デフォルトでAPIが複数設定されていることがわかります。(注: APIは本数が多ければ多いというわけではありませんが。)
LangServeを使用しない場合は、FastAPIのAPIRouter
を用いてルーティングを定義する必要があるなど、コード記述量が増えてしまいます。(一方で詳細かつ厳密なコーデングが要求される場合は、どちらを用いるべきかを精査する必要があります。)
LangSmithとの接続が容易
LangSmithとはLangChain運用時の便利ツールであり、LLMのトークン数や出力、レイテンシなどを確認することができます。
LangSmithの使用には、API Keyが必要です。
以下リンクからアカウントを作成してAPI Keyを取得します。
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に応答履歴が保存されているはずです。
おわりに
LangServe×Ollamaを使ってローカルPCでLLMサーバーを立ち上げてみるという内容でした。
全て無料なので、ぜひ試してみてください。