これは、Ollama について深く掘り下げ、ローカル LLM と推論ベースのアプリケーションでローカル LLM を使用する方法について学んだことの最初の部分です。この投稿では、次のことを学びます —
LLM (ローカル LLM を含む) の基本を理解するには、このトピックに関する私の以前の投稿を参照してください。
ローカル LLM の領域で、私は最初に LMStudio に出会いました。アプリ自体は使いやすいですが、Ollama のシンプルさと操作性が気に入りました。 Ollama について詳しく知りたい場合は、ここを参照してください。
tl;dr: Ollama は、アクセスできる独自の厳選されたモデルのリストをホストしています。
これらのモデルをローカル マシンにダウンロードし、コマンド ライン プロンプトを介してこれらのモデルを操作できます。あるいは、モデルを実行すると、Ollama はポート 11434 (デフォルト) でホストされる推論サーバーも実行し、API や Langchain などの他のライブラリを介して対話できます。
この投稿の時点で、Ollama には 74 のモデルがあり、これには埋め込みモデルなどのカテゴリも含まれています。
選択した OS 用の Ollamaをダウンロードします。それが完了したら、コマンドollama
実行して、機能していることを確認します。ヘルプメニューが表示されるはずです —
Usage: ollama [flags] ollama [command] Available Commands: serve Start ollama create Create a model from a Modelfile show Show information for a model run Run a model pull Pull a model from a registry push Push a model to a registry list List models cp Copy a model rm Remove a model help Help about any command Flags: -h, --help help for ollama -v, --version Show version information Use "ollama [command] --help" for more information about a command.
モデルを使用するには、まず、Dockerhub (過去に使用したことがある場合) や Elastic Container Registry (ECR) などからイメージをプルダウンするのと同じように、Ollama からモデルを「プル」する必要があります。
Ollama には、実行すると確認できるいくつかのデフォルト モデル (Facebook のオープンソース LLM であるllama2
など) が付属しています。
ollama list
Ollama ライブラリ ページから操作したいモデル (たとえばphi
) を選択します。コマンドを実行して、このモデルをプルダウンできるようになりました。
ollama pull phi
ダウンロードが完了したら、次のコマンドを実行して、モデルがローカルで利用可能かどうかを確認できます。
ollama list
モデルが利用可能になったので、実行する準備が整いました。次のコマンドを使用してモデルを実行できます。
ollama run phi
回答の精度は必ずしも最高であるとは限りませんが、別のモデルを選択したり、微調整を行ったり、RAG のようなソリューションを独自に実装したりして精度を向上させることで、この問題に対処できます。
上記で示したのは、コマンド ライン プロンプトを使用して Ollama モデルを使用する方法です。ただし、Llama が実行している推論サーバーを確認すると、ポート 11434 にアクセスすることでプログラム的にアクセスする方法があることがわかります。
Langchain を使用して Ollama モデルにアクセスしたい場合は、次のようなものを使用できます。
from langchain_community.llms import Ollama from langchain.chains import RetrievalQA prompt = "What is the difference between an adverb and an adjective?" llm = Ollama(model="mistral") qa = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=retriever, return_source_documents=True, ) response = qa(prompt)
Ollama のModelfile
の概念を使用して、独自のモデル バリアントを作成することもできます。 Modelfile で設定するパラメータの詳細については、これらのドキュメントを参照してください。
モデルファイルの例 —
# Downloaded from Hugging Face https://huggingface.co/TheBloke/finance-LLM-GGUF/tree/main FROM "./finance-llm-13b.Q4_K_M.gguf" PARAMETER temperature 0.001 PARAMETER top_k 20 TEMPLATE """ {{.Prompt}} """ # set the system message SYSTEM """ You are Warren Buffet. Answer as Buffet only, and do so in short sentences. """
Modelfile を取得したら、次を使用してモデルを作成できます。
ollama create arjunrao87/financellm -f Modelfile
ここで、 financellm
LLM モデルの名前で、 arjunrao87
ollama.com ユーザー名 (オンライン ollam レジストリの名前空間としても機能します) に置き換えられます。この時点で、作成したモデルを Ollama 上の他のモデルと同様に使用できます。
モデルをリモート ollam レジストリにプッシュすることも選択できます。これを実現するには、次のことを行う必要があります。
ローカル llm を作成したら、次のコマンドを使用してそれを ollam レジストリにプッシュできます。
ollama push arjunrao87/financellm
🦄 さて、良いところに入りましょう。
Ollama を使おうとしている間に、より楽しい発見の 1 つは、Python ベースの Web アプリケーション ビルダーのエコシステムに出会ったことです。 Chainlitを使用すると、ChatGPT のような本格的なチャットボットを構築できます。彼らのページにあるように、
Chainlit は、本番環境に対応した会話型 AI を構築するためのオープンソース Python パッケージです
私は、Chainlit で何ができるかを理解するために、Chainlit のチュートリアルをいくつか見ていきました。これには、一連のタスク (「ステップ」と呼ばれます) の作成、ボタンとアクションの有効化、画像の送信、その他あらゆる種類のことが含まれます。私の旅のこの部分は ここからご覧いただけます。
Chainlit のコツを理解したら、基本的に Ollama を使用する単純なチャットボットを組み立てて、(ChatGPT や Claude の代わりに) ローカル LLM を使用してチャットできるようにしたいと思いました。
Chainlit + Ollama を使用すると、50 行未満のコードでそれを行うことができます。それはクレイジーではないですか?
ライブラリとしての Chainlit は非常に簡単に使用できます。 Ollama の使用と操作には Langchain も使用しました。
from langchain_community.llms import Ollama from langchain.prompts import ChatPromptTemplate import chainlit as cl
次のステップは、chainlit の@cl.on_chat_start
デコレーターを使用して、チャットボットの読み込み画面をどのように表示するかを定義することです。
@cl.on_chat_start async def on_chat_start(): elements = [cl.Image(name="image1", display="inline", path="assets/gemma.jpeg")] await cl.Message( content="Hello there, I am Gemma. How can I help you?", elements=elements ).send() .... ....
Message
インターフェイスは、Chainlit が UI に応答を送り返すために使用するものです。シンプルなcontent
キーを使用してメッセージを構築し、それをelements
などで装飾することができます。私の場合は、ユーザーが最初にログインしたときに画像を表示するためにImage
を追加しました。
次のステップでは、Langchain を呼び出して Ollama (選択したモデルで) をインスタンス化し、プロンプト テンプレートを構築します。 cl.user_session
の使用は主に、ユーザー コンテキストと履歴の分離を維持するために行われますが、これは簡単なデモを実行するためだけであり、厳密に必要なわけではありません。
Chain は、カスタム チェーンの作成に使用されるRunnable
と呼ばれる Langchain インターフェイスです。詳細については、こちらをご覧ください。
@cl.on_chat_start async def on_chat_start(): .... .... model = Ollama(model="mistral") prompt = ChatPromptTemplate.from_messages( [ ( "system", "You are a knowledgeable historian who answers super concisely", ), ("human", "{question}"), ] ) chain = prompt | model cl.user_session.set("chain", chain)
これで、チャットボット UI を構築し、ユーザー入力を受け入れるためのすべての要素が揃いました。ユーザーが提供するプロンプトに対して何をしますか? Chainlit の@cl.on_message
ハンドラーを使用して、ユーザーが提供したメッセージに対して何らかの処理を行います。
@cl.on_message async def on_message(message: cl.Message): chain = cl.user_session.get("chain") msg = cl.Message(content="") async for chunk in chain.astream( {"question": message.content}, ): await msg.stream_token(chunk) await msg.send()
ドキュメントでは「応答のチャンクを非同期でストリームバックする」ことが示唆されているように、 chain.astream
はボットに必要なものです。
本当にそうです。いくつかのインポート、いくつかの関数、少しの砂糖を加えれば、機能的なチャットボットが完成します。
完全なコードについては、私のGitHubを参照してください。
このコンテンツに興味がある場合は、 👏ボタンをクリックするか、こちらからニュースレターを購読してください → https://a1engineering.beehiiv.com/subscribe 。多かれ少なかれ何かをする必要があるというフィードバックが得られます。ありがとう❤️
ここでも公開されています