optillm LLM の精度とパフォーマンスを向上させることができるいくつかの最先端の技術を実装する OpenAI API 互換の最適化推論プロキシです。現在の焦点は、コーディング、論理的および数学的クエリよりも推論を改善する技術の実装にあります。推論時に追加の計算を実行することで、さまざまなタスクにわたってこれらの手法を使用してフロンティア モデルを打ち負かすことが可能です。
pip install optillm
optillm
2024-10-22 07:45:05,612 - INFO - Loaded plugin: privacy
2024-10-22 07:45:06,293 - INFO - Loaded plugin: memory
2024-10-22 07:45:06,293 - INFO - Starting server with approach: auto
git
を使用してリポジトリのクローンを作成し、 pip install
使用して依存関係をセットアップします。
git clone https://github.com/codelion/optillm.git
cd optillm
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
OPENAI_API_KEY
環境変数 (OpenAI の場合)、またはAZURE_OPENAI_API_KEY
、 AZURE_API_VERSION
およびAZURE_API_BASE
環境変数 (Azure OpenAI の場合)、またはAZURE_API_VERSION
およびAZURE_API_BASE
環境変数を設定し、マネージド ID を使用して Azure OpenAI のaz login
を使用してログインします (こちらを参照)。
その後、次のようにoptillmプロキシを実行できます。
python optillm .py
2024-09-06 07:57:14,191 - INFO - Starting server with approach: auto
2024-09-06 07:57:14,191 - INFO - Server configuration: { ' approach ' : ' auto ' , ' mcts_simulations ' : 2, ' mcts_exploration ' : 0.2, ' mcts_depth ' : 1, ' best_of_n ' : 3, ' model ' : ' gpt-4o-mini ' , ' rstar_max_depth ' : 3, ' rstar_num_rollouts ' : 5, ' rstar_c ' : 1.4, ' base_url ' : ' ' }
* Serving Flask app ' optillm '
* Debug mode: off
2024-09-06 07:57:14,212 - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:8000
* Running on http://192.168.10.48:8000
2024-09-06 07:57:14,212 - INFO - Press CTRL+C to quit
プロキシが実行されたら、 base_url
http://localhost:8000/v1
に設定することで、OpenAI クライアントのドロップイン置換として使用できます。
import os
from openai import OpenAI
OPENAI_KEY = os . environ . get ( "OPENAI_API_KEY" )
OPENAI_BASE_URL = "http://localhost:8000/v1"
client = OpenAI ( api_key = OPENAI_KEY , base_url = OPENAI_BASE_URL )
response = client . chat . completions . create (
model = "moa-gpt-4o" ,
messages = [
{
"role" : "user" ,
"content" : "Write a Python program to build an RL model to recite text from any position that the user provides, using only numpy."
}
],
temperature = 0.2
)
print ( response )
上記のコードは OpenAI と Azure OpenAI の両方に適用されますが、 OPENAI_API_KEY
環境変数に適切なキーを設定することを忘れないでください。最適化手法を制御するには複数の方法があり、次の優先順位で適用されます。
{slug}-model-name
の先頭にスラッグを追加することで、最適化に使用する手法を制御できます。たとえば、上記のコードでは、最適化アプローチとしてmoa
またはエージェントの混合を使用しています。プロキシ ログには、 moa
がgpt-4o-mini
として基本モデルで使用されていることを示す次の内容が表示されます。 2024-09-06 08:35:32,597 - INFO - Using approach moa, with gpt-4o-mini
2024-09-06 08:35:35,358 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions " HTTP/1.1 200 OK "
2024-09-06 08:35:39,553 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions " HTTP/1.1 200 OK "
2024-09-06 08:35:44,795 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions " HTTP/1.1 200 OK "
2024-09-06 08:35:44,797 - INFO - 127.0.0.1 - - [06/Sep/2024 08:35:44] " POST /v1/chat/completions HTTP/1.1 " 200 -
extra_body
のoptillm _approach
フィールドでスラッグを渡すこともできます。 response = client.chat.completions.create(
model= " gpt-4o-mini " ,
messages=[{ " role " : " user " , " content " : " " }],
temperature=0.2,
extra_body={ " optillm _approach " : " bon|moa|mcts " }
)
system
またはuser
プロンプトの< optillm _approach> </ optillm _approach>
タグ内でアプローチを言及することもできます。 response = client.chat.completions.create(
model= " gpt-4o-mini " ,
messages=[{ " role " : " user " , " content " : " < optillm _approach>re2</ optillm _approach> How many r's are there in strawberry? " }],
temperature=0.2
)
ヒント
また、記号&
と|
使用して、さまざまな手法を組み合わせることができます。 。 &
使用すると、テクニックはパイプライン内で左から右の順序で処理され、前のステージからの応答が次のステージへのリクエストとして使用されます。一方、 |
使用すると、すべてのリクエストを並行して実行し、リストとして返される複数のレスポンスを生成します。
上記の規則は、推論アプローチをauto
に設定してoptillmサーバーが起動された場合にのみ機能することに注意してください。それ以外の場合、クライアント要求のmodel
属性にはモデル名のみを設定する必要があります。
すべての LLM プロバイダーを (LiteLLM SDK をラップアラウンドすることにより) サポートするようになりました。たとえば、環境変数os.environ['GEMINI_API_KEY']
に API キーを渡すように設定し、モデルmoa-gemini/gemini-1.5-flash-002
を呼び出すことで、 moa
で Gemini Flash モデルを使用できます。出力では、LiteLLM が基本モデルの呼び出しに使用されていることがわかります。
9:43:21 - LiteLLM:INFO: utils.py:2952 -
LiteLLM completion () model= gemini-1.5-flash-002; provider = gemini
2024-09-29 19:43:21,011 - INFO -
LiteLLM completion () model= gemini-1.5-flash-002; provider = gemini
2024-09-29 19:43:21,481 - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-002:generateContent ? key=[redacted] " HTTP/1.1 200 OK "
19:43:21 - LiteLLM:INFO: utils.py:988 - Wrapper: Completed Call, calling success_handler
2024-09-29 19:43:21,483 - INFO - Wrapper: Completed Call, calling success_handler
19:43:21 - LiteLLM:INFO: utils.py:2952 -
LiteLLM completion () model= gemini-1.5-flash-002; provider = gemini
ヒント
optillm透過的なプロキシであり、OpenAI API 互換のチャット完了エンドポイントを持つ任意の LLM API またはプロバイダーと連携します。また、 optillm同じ OpenAI API 互換のチャット完了エンドポイントも公開します。これにより、既存のツールやフレームワークに簡単に統合できるようになります。使用したい LLM に OpenAI API 互換のエンドポイント (Google や Anthropic など) がない場合は、ほとんどの LLM をサポートする LiteLLM プロキシ サーバーを使用できます。
次のシーケンス図は、リクエストとレスポンスがoptillmどのように通過するかを示しています。
図では次のようになります。
A
、 optillmの結果を使用する既存のツール (oababooga など)、フレームワーク (パッチワークなど)、または独自のコードです。任意の OpenAI クライアント SDK を使用して直接使用できます。B
リクエストをbase_url
に送信するoptillmサービス (直接または Docker コンテナ内で実行されます) です。C
、OpenAI API 互換のチャット完了エンドポイントを提供するサービスです。optillmでの HuggingFace モデルまたは LoRA の直接ロードをサポートしています。組み込みの推論サーバーを使用するには、 optillm _API_KEY
任意の値に設定し (たとえば、 export optillm _API_KEY=" optillm "
)、OpenAI クライアントで同じ値を使用します。モデルフィールドには任意のHuggingFaceモデルを渡すことができます。プライベート モデルの場合は、HuggingFace キーを使用してHF_TOKEN
環境変数を設定してください。 +
区切り文字を使用してモデルの上に任意の数の LoRA を追加することもサポートしています。
たとえば、次のコードはベース モデルmeta-llama/Llama-3.2-1B-Instruct
ロードし、次に 2 つの LoRA ( patched-codes/Llama-3.2-1B-FixVulns
およびpatched-codes/Llama-3.2-1B-FastApply
をその上に追加します。 。 OpenAI SDK クライアントのextra_args
フィールドのactive_adapter
パラメータを使用して、どの LoRA を使用するかを指定できます。デフォルトでは、最後に指定されたアダプターをロードします。
OPENAI_BASE_URL = "http://localhost:8000/v1"
OPENAI_KEY = " optillm "
response = client . chat . completions . create (
model = "meta-llama/Llama-3.2-1B-Instruct+patched-codes/Llama-3.2-1B-FastApply+patched-codes/Llama-3.2-1B-FixVulns" ,
messages = messages ,
temperature = 0.2 ,
logprobs = True ,
top_logprobs = 3 ,
extra_body = { "active_adapter" : "patched-codes/Llama-3.2-1B-FastApply" },
)
cot_decoding
やentropy_decoding
などの代替デコード手法をローカル推論サーバーで直接使用することもできます。
response = client . chat . completions . create (
model = "meta-llama/Llama-3.2-1B-Instruct" ,
messages = messages ,
temperature = 0.2 ,
extra_body = {
"decoding" : "cot_decoding" , # or "entropy_decoding"
# CoT specific params
"k" : 10 ,
"aggregate_paths" : True ,
# OR Entropy specific params
"top_k" : 27 ,
"min_p" : 0.03 ,
}
)
OPENAI_API_KEY
環境変数をプレースホルダー値に設定しますexport OPENAI_API_KEY="sk-no-key"
。./llama-server -c 4096 -m path_to_model
を実行して、指定されたモデルと 4096 トークンのコンテキスト長でサーバーを起動します。python3 optillm .py --base_url base_url
実行してプロキシを開始しますpython3 optillm .py --base_url http://localhost:8080/v1
を実行します。 警告
Anthropic API、llama-server (および ollama) は現在、モデルからの複数の応答のサンプリングをサポートしていないことに注意してください。そのため、使用可能なアプローチはcot_reflection
、 leap
、 plansearch
、 rstar
、 rto
、 self_consistency
、 re2
、およびz3
に制限されます。 HuggingFace のモデルの場合、複数の応答をサポートしているため、組み込みのローカル推論サーバーを使用できます。
アプローチ | ナメクジ | 説明 |
---|---|---|
リフレクションを伴う CoT | cot_reflection | <思考>、<考察>、<出力> セクションを使用して思考連鎖推論を実装します。 |
プランサーチ | plansearch | 自然言語で問題を解決するための候補プランに対する検索アルゴリズムを実装します。 |
再読 | re2 | クエリを 2 回処理することで推論を改善するための再読み取りを実装します。 |
自己一貫性 | self_consistency | 高度な自己一貫性メソッドを実装します |
Z3 ソルバー | z3 | 論理的推論に Z3 定理証明器を利用します |
R*アルゴリズム | rstar | 問題解決のための R* アルゴリズムを実装します |
飛躍 | leap | いくつかのショット例からタスク固有の原則を学びます |
ラウンドトリップの最適化 | rto | ラウンドトリッププロセスを通じて応答を最適化します。 |
ベスト・オブ・Nサンプリング | bon | 複数の応答を生成し、最適なものを選択します |
薬剤の混合物 | moa | 複数の批評からの回答を組み合わせます |
モンテカルロツリー検索 | mcts | チャット応答の意思決定に MCTS を使用します |
PVゲーム | pvg | 推論時に証明者検証者ゲームのアプローチを適用します |
CoT デコード | プロキシには該当なし | 明示的なプロンプトなしで推論を引き出すための思考連鎖デコードを実装します。 |
エントロピー復号化 | プロキシには該当なし | 生成中のトークンの不確実性に基づいて適応サンプリングを実装します。 |
プラグイン | ナメクジ | 説明 |
---|---|---|
ルーター | router | optillm -bert-uncased モデルを使用して、ユーザー プロンプトに基づいてリクエストをさまざまなアプローチにルーティングします。 |
コードチェーン | coc | CoT とコード実行および LLM ベースのコード シミュレーションを組み合わせたコード チェーン アプローチを実装します。 |
メモリ | memory | 短期メモリ層を実装し、任意の LLM で無制限のコンテキスト長を使用できるようにします |
プライバシー | privacy | リクエストで PII データを匿名化し、レスポンスで匿名化を解除して元の値に戻す |
URLを読む | readurls | リクエスト内で見つかったすべての URL を読み取り、URL のコンテンツを取得してコンテキストに追加します。 |
コードを実行する | executecode | コードインタープリタを使用して、リクエストおよび LLM 生成のレスポンスで Python コードを実行できるようにします。 |
optillm構成用のさまざまなコマンドライン引数と環境変数をサポートしています。
パラメータ | 説明 | デフォルト値 |
---|---|---|
--approach | 使用する推論アプローチ | "auto" |
--simulations | MCTS シミュレーションの数 | 2 |
--exploration | MCTS の探査ウェイト | 0.2 |
--depth | MCTS のシミュレーションの深さ | 1 |
--best-of-n | best_of_n アプローチのサンプル数 | 3 |
--model | 使用するOpenAIモデル | "gpt-4o-mini" |
--base-url | OpenAI互換エンドポイントのベースURL | "" |
--rstar-max-depth | rStar アルゴリズムの最大深度 | 3 |
--rstar-num-rollouts | rStar アルゴリズムのロールアウト数 | 5 |
--rstar-c | rStar アルゴリズムの探索定数 | 1.4 |
--n | 返される最終応答の数 | 1 |
--return-full-response | タグ付きの CoT を含む完全な応答を返します。 | False |
--port | プロキシを実行するポートを指定します | 8000 |
-- optillm -api-key | optillmへのクライアント認証用のオプションの API キー | "" |
Docker を使用する場合、これらはoptillm _
というプレフィックスを付けた環境変数として設定できます。
optillm必要に応じて、Docker および提供された Dockerfile を使用して構築および実行できます。
システムに Docker と Docker Compose がインストールされていることを確認してください。
docker-compose.yaml ファイル内の環境変数を更新するか、プロジェクトのルート ディレクトリに.env
ファイルを作成して、設定する環境変数を追加します。たとえば、OpenAI API キーを設定するには、 .env
ファイルに次の行を追加します。
OPENAI_API_KEY=your_openai_api_key_here
次のコマンドを実行してoptillmを開始します。
docker compose up -d
これにより、Docker イメージが存在しない場合はビルドされ、 optillmサービスが開始されます。
optillm http://localhost:8000
で入手できます。
Docker を使用する場合、これらのパラメーターを環境変数として設定できます。たとえば、アプローチとモデルを設定するには、次を使用します。
optillm _APPROACH=mcts
optillm _MODEL=gpt-4
API キーを使用してoptillmプロキシを保護するには、 optillm _API_KEY
環境変数を設定します。
optillm _API_KEY=your_secret_api_key
API キーが設定されている場合、クライアントはAuthorization
ヘッダーを使用してリクエストに API キーを含める必要があります。
Authorization: Bearer your_secret_api_key
モデル | スコア |
---|---|
o1-mini | 56.67 |
coc-claude-3-5-sonnet-20241022 | 46.67 |
coc-gemini/gemini-exp-1121 | 46.67 |
o1-プレビュー | 40.00 |
ジェミニ-exp-1114 | 36.67 |
クロード-3-5-ソネット-20241022 | 20.00 |
ジェミニ-1.5-プロ-002 | 20.00 |
ジェミニ-1.5-フラッシュ-002 | 16.67 |
モデル | 正確さ |
---|---|
readurls&memory-gpt-4o-mini | 61.29 |
gpt-4o-mini | 50.61 |
readurls&memory-Gemma2-9b | 30.1 |
ジェマ2-9b | 5.1 |
ジェマ2-27b | 30.8 |
ジェミニフラッシュ 1.5 | 66.5 |
ジェミニプロ1.5 | 72.9 |
モデル | パス@1 | パス@5 | パス@10 |
---|---|---|---|
プランサーチ-gpt-4o-mini | 44.03 | 59.31 | 63.5 |
gpt-4o-mini | 43.9 | 50.61 | 53.25 |
クロード-3.5-ソネット | 51.3 | ||
gpt-4o-2024-05-13 | 45.2 | ||
gpt-4-turbo-2024-04-09 | 44.2 |
optillm OpenAI API のドロップイン代替品であるため、OpenAI クライアントを使用して既存のツールやフレームワークと簡単に統合できます。私たちはoptillmパッチワークとともに使用しました。これは、パッチフローと呼ばれるワークフローを使用して、PR レビュー、バグ修正、セキュリティ パッチ適用などの開発の単純な作業を自動化するオープンソース フレームワークです。エージェントの混合アプローチ (moa) を使用すると、以下に示すように、サポートされているすべてのパッチフローでパフォーマンスが大幅に向上することがわかりました。