1 ポイント 投稿者 GN⁺ 2024-02-09 | 1件のコメント | WhatsAppで共有
  • OllamaはOpenAI Chat Completions APIとの初期互換性を組み込み、OpenAI向けのツールやアプリケーションをローカルモデルにそのまま接続できるようになった
  • インストール後、llama2mistralのようなモデルをダウンロードし、OpenAIのリクエスト形式を維持したままホストだけを変更すれば呼び出せる
  • OpenAI Python・JavaScriptライブラリでは、base_url/baseURLを指定し、必須だが使用されないapi_key値を入れることで動作する
  • Vercel AI SDKのストリーミングチャットアプリと、Microsoft AutogenのマルチエージェントフレームワークをOllamaに接続する例が提供されている
  • 現在のサポートは初期の実験的サポート段階であり、Embeddings API、関数呼び出し、ビジョン対応、Logprobsの改善は今後の検討対象

OpenAI API形式でOllamaを呼び出す

  • OllamaはOpenAI Chat Completions APIと互換性のあるエンドポイントを提供し、ローカルモデルを既存のOpenAIベースのツールで使えるようにする
  • 始めるには、Ollamaをインストールし、Llama 2またはMistralのようなモデルをダウンロードする
ollama pull llama2
  • cURLでは、OpenAIのリクエスト形式はそのままに、ホストをhttp://localhost:11434へ変更する
curl http://localhost:11434/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "llama2",
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "Hello!"
}
]
}'
  • OpenAI Pythonライブラリでは、base_urlをOllamaのローカルエンドポイントに指定する
    • api_key='ollama'は必須だが使用されない
from openai import OpenAI
client = OpenAI(
base_url = 'http://localhost:11434/v1',
api_key='ollama',
)
response = client.chat.completions.create(
model="llama2",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Who won the world series in 2020?"},
{"role": "assistant", "content": "The LA Dodgers won in 2020."},
{"role": "user", "content": "Where was it played?"}
]
)
print(response.choices[0].message.content)
  • OpenAI JavaScriptライブラリでは、baseURLhttp://localhost:11434/v1に設定する
    • apiKey: 'ollama'も必須だが使用されない
import OpenAI from 'openai'
const openai = new OpenAI({
baseURL: 'http://localhost:11434/v1',
apiKey: 'ollama',
})
const completion = await openai.chat.completions.create({
model: 'llama2',
messages: [{ role: 'user', content: 'Why is the sky blue?' }],
})
console.log(completion.choices[0].message.content)

統合例と今後の計画

  • Vercel AI SDKは対話型ストリーミングアプリケーションを作るためのオープンソースライブラリで、Next.jsのOpenAIサンプルをOllama向けに置き換えて使える
npx create-next-app --example https://github.com/vercel/ai/tree/main/examples/next-openai example
cd example
  • app/api/chat/route.tsでOpenAIクライアント設定をOllamaのローカルエンドポイントに変更する
const openai = new OpenAI({
baseURL: 'http://localhost:11434/v1',
apiKey: 'ollama',
});
  • チャット補完リクエストでは、llama2モデルとstream: trueを使用する
const response = await openai.chat.completions.create({
model: 'llama2',
stream: true,
messages,
});
npm run dev
  • AutogenはMicrosoftのマルチエージェントアプリケーション向けオープンソースフレームワークで、例ではCode Llamaを使用する
ollama pull codellama
pip install pyautogen
from autogen import AssistantAgent, UserProxyAgent
config_list = [
{
"model": "codellama",
"base_url": "http://localhost:11434/v1";,
"api_key": "ollama",
}
]
assistant = AssistantAgent("assistant", llm_config={"config_list": config_list})
user_proxy = UserProxyAgent("user_proxy", code_execution_config={"work_dir": "coding", "use_docker": False})
user_proxy.initiate_chat(assistant, message="Plot a chart of NVDA and TESLA stock price change YTD.")
  • 例はpython example.pyで実行し、アシスタントにチャートを描くコードを書かせる
python example.py
  • OpenAI APIサポートは初期の実験的サポート段階にある
    • 今後の改善検討項目はEmbeddings API、関数呼び出し、ビジョン対応、Logprobs
    • GitHub Issueを受け付けており、詳細はOpenAI互換性ドキュメントで確認できる

1件のコメント

 
GN⁺ 2024-02-09
Hacker News のコメント
  • ここ数か月で ローカル LLM ホスティングの使い勝手が良くなるスピードには驚かされる。ほんの数時間前まで https://github.com/Mozilla-Ocho/llamafile がどれほど簡単かを話していたのに[1]、今では何を使うべきか迷うほどになっている
    [1] 文字どおり数時間前: https://euri.ca/blog/2024-llm-self-hosting-is-easy-now/

    • 今では、企業が基本的な RAG 対応の推論サーバーを自前でホストするのがずっと簡単になったと思う。Mac Mini や Mac Studio を買い、ollama serve を実行し、Docker で ollama web-ui を立ち上げ、Web UI から OllamaHub のコーディング支援モデルを追加して、ドキュメントをアップロードすればよい
      コードを書かなくても、ドキュメントをコンテキストとして回答するセルフホスト LLM が手に入る。こちらでは 64GB RAM の Mac Studio で deepseek coder 33b が十分高速に動き、社内のコーディング文書をもとにかなり良い提案をしてくれる
    • 個人的には Ollama を薦める。モデル管理の仕組みが Docker に似た形でよくできていて、API のサポートもより広い
      1つのモデルファイル内で複数のモデルを混ぜることもでき、これは最近試している機能だ。必ずしも Ollama のモデルライブラリに依存する必要はなく、自作モデルも使える。新しいモデルのサポートは llama.cpp バインディング経由で入ってくる
    • この分野の進歩の速さは本当に驚く。llamafile を起動しやすい点はよかったが、機能が十分なチャットインターフェースが欲しかったので、その上に https://recurse.chat/ を作った
      まだ一部の作業には GPT-4 が必要だが、日常的な利用では ChatGPT 利用のかなりの部分を置き換えられており、特に ChatGPT のチャット履歴をすべて取り込めるのが良い。人々がローカル AI で何をしたいのかも気になっている
    • MBP でローカル開発用に Ollama と Mixtral-7B を使っているが、とても満足している
    • ずっと llamacpp -m -p だけを使ってきて、MacBook で Mixtral 8x7b + CodeLlama 70b を日常ツールのように問題なく使っている。Llama.cpp の代替には決定的な機能があるのか気になるし、新しい面白い流れを見逃したくない
  • 経営学の教授だが、学生に Ollama と web-ui を試してもらうため、Google Cloud 上で動かす手順書を作った[1]。スポットインスタンスを使えば1時間あたり18セントで動かせる
    [1] https://docs.google.com/document/d/1OpZl4P3d0WKH9XtErUZib5_2...

    • この設定だと、学生が管理者権限を奪われてインスタンスを乗っ取られる可能性がある。非常に安全ではない。git-bashSSH キーを使わせることを強く勧める。すでに説明している内容より技術的に難しいわけでもない
    • Google Colab でも多くのものを無料で動かせる。KoboldCPP は Web サイトに事前構築済みの実行環境がよく整っていて、ほかのモデルも読み込める
  • OpenAI API 互換性がコミュニティ標準になりつつあることを内心気持ち悪く感じている人を何人か知っている。data.choices.text.response のようなぎこちなさや、スキーマの不必要に防御的なネストを除けば、特に不満はない
    API が標準になっていく過程でどんな痛点があるのか、検討に値する代替標準を試した人がいるのか気になる

    • 文書化が必要だ
      コミュニティ標準として定着するのは構わないが、コミュニティが言う OpenAI API 互換が何を意味するのかについて、非常に堅牢な仕様が必要だ。特に OpenAI が今朝新機能を出したとしても、その標準は安定して維持されるべきだ
      欲しいのは、エラー条件まで含む堅牢な API 仕様、新しい実装が仕様に従っているか確認できるテストスイート、そして名称だ。たとえば、あるソフトウェアが OpenAI-API-Spec v3 と互換だと言うとき、その意味を知りたい。今のように「OpenAI API 互換」とだけ言われても情報が足りない。API のどの部分なのか、どの時点の API に合わせているのか分からない
    • 正直、これを追加する前に内部でかなり議論した。他人の API に縛られて、自分たちのプロジェクトにどんな機能を入れるべきか、あるいは入れるべきでないかを、その API が左右し得るというのは奇妙だ
      Ollama にクールで新しくて別種の機能を追加しても、OpenAI API に対応物がなければ、人々がそれを使えるのか分からない
    • だから選択肢として提供されるのは良いことだ。摩擦を減らし、OpenAI の堀への依存を下げられる
    • 標準がないよりは、不完全な標準のほうが常にましだと思う
    • 好きな言語のバインディングで llama.cpp の関数を直接呼び出す Web サーバーを作るのはとても簡単なので、大きな問題ではない。もっと制御が必要なら少し作業を足せばよく、必ずしもこうしたプラグアンドプレイのツールが必要なわけではない
  • 職場で Copilot より良いバージョンを作っていて、ユーザーが自分の LLM を持ち込む方式もサポートしている。最近は OpenAI 互換バックエンドを追加しており、OpenAI 互換 API エンドポイントと、どのモデルのように扱うかを教えてくれれば、そのモデルの意味論に合わせてプロンプト、停止シーケンス、最大トークン数などをフォーマットできる
    ローカル開発環境でテストするために、まさにこういうものが必要だった。Ollama がこれをサポートすれば、こちらが対応しなければならない多数の LLM に対するテストがずっと楽になる。OpenLLM など複数のツールも同じ API を実装しているのを見ると、みな OpenAI API 互換性に収束しているようだ

  • AIスタートアップを作っている感覚が本当に良い
    最初はトークン制限に苦労したが解決され、一貫したJSON出力の問題も解決され、大手サードパーティモデルの速度制限と性能の問題も解決され、小〜中程度の複雑さのタスク向けにオープンソースモデルをセルフホストしてコストを下げたいという課題も解決された
    主要なLLMの進歩が出るたびに、製品が自動的により安く、より安定し、よりスケーラブルになっていく感じがする。もちろん防御力を作り、「AIではない」あらゆる部分で差別化することに集中する必要がある

    • トークン制限が解決されたというのはどういう意味なのか気になる。最近のバージョンの コンテキスト上限 がはるかに大きくなったが、コストもはるかに高くなったことを指しているのだろうか?
  • OpenAI互換と言うと 関数呼び出しやツール呼び出し まで期待してしまうので、少し誤解を招く可能性があると思う
    ロールと内容の構造があるのは良いが、それはもともと実装がかなり単純だった。エージェントになると実際のアクション実行が必要になる。自分が始めたエージェントホスティングシステムにはスクリプトエンジンを入れていて、だからセキュリティと権限を固めたうえで、エージェントに単にコードを実行させるべきではないかと思った。実際そうやって始めた
    なので関数/ツール呼び出しが本当に必要なのかは確信がない。ただ、多くの人がツール呼び出しを標準化しているなら、任意のスクリプト実行があっても自分のフレームワークに入れる必要があるかもしれない

    • ドキュメントでは除外されている機能を明確に示している: https://github.com/ollama/ollama/blob/main/docs/openai.md
      関数呼び出し/ツール選択 はアプリケーションレベルで処理され、現在標準形式はない。広く使われているものも、実質的には非効率なカスタムシステムプロンプトに近い: https://github.com/langchain-ai/langchain/blob/master/libs/l...
    • Gemini Proが関数/ツール呼び出しをサポートしているので惹かれたが、実際にはひどい動作だった。Gemini Ultraはまだ試しておらず、APIで可能かどうかも不明
      いずれにせよ、動かないサポートを出さないほうがよい場合もある
    • OpenAI APIを使ったことがある人には当然理解できる選択だ
  • 参考までに、OllamaのLinuxインストールスクリプトは最近のツールでよくある「標準」的な方式で動作する:
    curl https://ollama.ai/install.sh | sh
    ただし最後に確認したとき、このスクリプトはsudoroot権限 を要求していた。ツールを使いたいなら、スクリプトをダウンロードして確認するか、必要に応じて修正するとよい

    • 手動インストール手順がある[0]。それを見ると、起動時に自動実行される SystemDサービス を設定するようだ。単に試してみたいだけなら、[1]をダウンロードして実行可能にし(chmod +x ollama-linux-amd64)、実行するだけでもうまくいった。root権限は不要だった
      [0] https://github.com/ollama/ollama/blob/main/docs/linux.md#man...
      [1] https://ollama.ai/download/ollama-linux-amd64
    • ollamaバイナリは/usr/binに入るが、必ずそうである必要はないものの便利だ。それ以外に何がrootアクセスを必要とするのかは確認していない
    • 今の時代には パッケージマネージャ がある
  • 互換レイヤーはライブラリの中に作ることもできる。たとえばLangChainのllm()は複数のLLMバックエンドで動作できる。どちらを好むのか気になる

    • ライブラリ内にあるほうが好みだが、現状はかなり問題がある。最大の問題は、エコシステムの動きが速すぎて ライブラリラッパー が追いつけないこと
      もう一つは、世の中がLangChainのようなひどいライブラリで標準化してしまうと、均一でないバックエンドのメンテナンスコストのせいで後発が死に、長く縛られることになる点だ。だから今は、均一なAPIのほうが利便性の面で良い選択に見える
    • そうすると各ライブラリが各LLMをサポートする必要がある。これはオブジェクトストレージで、最終的にほぼ全員が S3互換API をサポートするようになったのと同じ問題だと思う
      完璧でなくても標準APIがあるのは良い。同時に、BackblazeのB2のように全体のポテンシャルを使える第2のAPIがあってもよい。1つですべてのモデルに合わせる方法はなく、モデルに異なる能力があるなら、両方の選択肢を提供するのがよいと思う
    • OpenAIがアプリを出す前は、自分のシステムでLangChainを使っていた。LLMにつけたとても単純な SMSインターフェース で、GPT-4 APIと直接向き合うよりも、LangChainの抽象化で作業するほうを好んでいた
  • Pythonでオープンソースモデル(HF、VLLM経由)と商用モデル(OpenAI、Google、Anthropic、Together)を簡単に差し替えられるプロジェクトを作っている: https://github.com/datadreamer-dev/DataDreamer
    HTTP APIなしで Pythonから直接 使いたいなら、もう少し簡単な方法だ

  • Ollamaの使いどころ が何なのか気になる。なぜllama.cppを直接使ってはいけないのか?

    • LLM向けのDocker/パッケージマネージャのようなもの。標準化されたシンプルなCLIで、簡単にインストールし、新しいモデルを探し、更新できる。自動更新も気軽にできる
    • 同じ疑問がある。Ollamaは宣伝も多く反応も良いようだが、最近はOpenAI互換の内蔵サーバーもあるllama.cppを直接使うのと比べて、正確にどんな利点があるのか気になる