llama.cpp
は、元々はLLMの一つllamaをローカルで動作させるためのツール群として開発されたが、
現在は(GGUF形式の)様々なLLMモデルを実行できる。
ツールの一つ、llama-server
はLLMのプロキシーとして動作するので、
制約*1はあるものの、
OpenAIの代わりにローカルのLLMモデル(Phi3, Mistral, Gemma2, Llamaなど)を使用してアプリケーションを動かすことができる。
つまり、OpenAIへの課金なしで(全てではないが)多くのLLMアプリを動作させることができる。
1. インストール
$ git clone https://github.com/ggerganov/llama.cpp $ cd llama.cpp $ make
2. LLMモデルのダウンロード
HuggingfaceからGGUF形式のLLMモデルをダウンロードし、適当なディレクトリに配置する。
3. テスト
llama-cli
で簡単な質問をしてモデルの動作チェックができる。
$ ./llama-cli -m models/Phi-3-mini-4k-instruct-q4.gguf -p "what is the tallest mountain in Japan?"
4. llama-server
llama-server
は例えば次のようにモデルを指定して起動する。
$ ./llama-server -c 4096 -m models/Phi-3-mini-4k-instruct-q4.gguf
5. アプリケーションの変更
基本的にはBASE_URLに"http://localhost:8080/v1"を設定するだけである。
import os from openai import OpenAI OPENAI_KEY = "no_key" OPENAI_BASE_URL = "http://localhost:8080/v1" client = OpenAI(api_key=OPENAI_KEY, base_url=OPENAI_BASE_URL) response = client.chat.completions.create( model="gpt-4o", messages=[ { "role": "user", "content": "What is the tallest mountain in Japan?" } ], temperature=0.2 ) print(response)
実行結果は以下の通り。
$ python test.py ChatCompletion(id='chatcmpl-1d2BjdNHNUiHothjkQ1sUWrMlr8HSBX8', choices=[Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content='The tallest mountain in Japan is Mount Fuji, which stands at 3,776 meters (12,388 feet) above sea level. It is located on the main island of Honshu, about 100 kilometers (62 miles) west of Tokyo.', refusal=None, role='assistant', function_call=None, tool_calls=None))], created=1727315791, model='gpt-4o', object='chat.completion', service_tier=None, system_fingerprint=None, usage=CompletionUsage(completion_tokens=52, prompt_tokens=17, total_tokens=69, completion_tokens_details=None))
*1:例えば"Only one completion choice is allowed"