簡単
この文書では オーラマ Ollamaは大規模な言語モデルのためのオープンソースのデプロイツールであり、LangChainは言語モデルベースのアプリケーションを構築するためのフレームワークです。この2つを組み合わせることで、高度なAIモデルをローカル環境に迅速に展開し、利用することができる。
注:この文書には、核となるコードの断片と詳細な説明が含まれています。完全なコードはこのJupyterノートブックで発見された。
1.環境設定
Conda環境の設定
まず、JupyterでConda環境を使う必要がある。コマンドラインから以下のコマンドを実行する:
conda create -n handlm python=3.10 -y
condaはhandlmをアクティブにする
pip install jupyter
python -m ipykernel install --user --name=handlm
実行後、Jupyterを再起動し、その環境のカーネルを選択してください:
⚠️ 注
注目してほしい: condaの仮想環境を使わずに、グローバル環境を直接使用することも可能です。
依存関係のインストール
始める前に、以下のパッケージをインストールする必要がある:
ラングチェーン・オラマ
OllamaモデルをLangChainフレームワークに統合する。ラングチェーン
LangChainのコア・ライブラリは、AIアプリケーションを構築するためのツールと抽象化を提供します。ラングチェーン・コミュニティ
コミュニティから提供された様々な統合やツールを含む枕
マルチモーダルなタスクで使用される画像処理用ファイス・シーピーユー
シンプルな建築用 ラグ レトリーバー
以下のコマンドでインストールできる:
pip install langchain-ollama langchain langchain-community Pillow faiss-cpu
2.必要なモデルをダウンロードし、OllamaLLMを初期化する。
llama3.1 モデルのダウンロード
- 公式ウェブサイトhttps://ollama.com/download、Ollamaをダウンロードし、対応プラットフォームにインストールしてください。
- 利用可能な全モデルについては、https://ollama.ai/library。
- とおす
OLLAMA プル <モデル名
コマンドを使用して、利用可能なLLMモデルを取得することができます(例:ollama pull llama3.1
).
コマンドラインは図のように実行される:
モデルの保管場所
- マックだ。
~/.ollama/models/
- Linux(またはWSL)。
/usr/share/ollama/.ollama/models
- ウィンドウズ
C: \UsersersAdministrator.ollama
3.基本的な使用例
ChatPromptTemplateを使って会話をする
ChatPromptTemplateを使用すると、1つ以上のパラメータを持つ再利用可能なテンプレートを作成することができます。これらのパラメータは、異なるプロンプトを生成するために実行時に動的に置き換えることができます。
テンプレート = ""
あなたは様々な質問に答えるのが得意な役に立つAIです。
質問: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
チェーン = プロンプト|モデル
chain.invoke({"質問": "GPT4より優れていますか?"})
Create Chainセクションで、パイプ演算子 |
プロンプトとモデルをつなげて処理の流れを形成する。この連鎖により、異なるコンポーネントの組み合わせや再利用が容易になる。
呼ぶ
メソッドは処理チェーン全体をトリガーし、私たちの質問をテンプレートに渡し、処理のためにフォーマットされたプロンプトをモデルに送ります。
ストリーミング出力
ストリーミング出力は、長いテキストを生成するときに結果をインクリメンタルに返す手法である。この方法にはいくつかの重要な利点がある:
- ユーザーエクスペリエンスの向上:ユーザーは、回答全体が完了するまで待つのではなく、部分的な結果をすぐに見ることができます。
- 待ち時間の短縮:長い回答の場合、完全な回答が生成される前に読み始めることができます。
- リアルタイム・インタラクション:生成プロセス中の介入や終了が可能。
実際には、特にチャットボットやリアルタイムの対話システムでは、ストリーミング出力はほとんど不可欠だ。
from langchain_ollama import チャットオラマ
model = ChatOllama(model="llama3.1", temperature=0.7)
メッセージ = [
("human", "Hello"), ]。
]
for chunk in model.stream(messages): print(chunk.content, end(messages)): ["human", "hello"), ]。
print(chunk.content, end='', flush=True)
model.stream()
メソッドはOllama APIのストリーミング出力インターフェースのラッパーで、ジェネレーター・オブジェクトを返します。メソッドを呼び出すと model.stream(messages)
そうすると、以下の操作が完了する:
- Ollama API にリクエストを送信し、レスポンスの生成を開始します。
- APIはテキストを生成し始めるが、それがすべて生成されるまで待つのではなく、小さなチャンクに分けて返す。
- 受信した各小部分のテキストに対して
ストリーム()
メソッドはテキストのブロックを生成する。 flush=真
各クリップは、バッファがいっぱいになるのを待つのではなく、すぐに表示されるようにする。
ツールコール
ツール・コールとは、AIモデルが外部の関数やAPIと相互作用する機能のことである。これにより、モデルは数学的計算、データ照会、外部サービス呼び出しなどの複雑なタスクを実行できる。
def simple_calculator(operation: str, x: float, y: float) -> float.
'''実際のコード処理ロジック''''
llm = ChatOllama(
model="llama3.1"、
temperature=0、
).bind_tools([simple_calculator])
result = llm.invoke("Do you know what 1000 million times two?")
バインドツール
メソッドによって、モデルにカスタム関数を登録することができる。こうすることで、モデルが計算を必要とする問題に遭遇したとき、事前学習の知識に頼るのではなく、この関数を呼び出して正確な結果を得ることができる。
この機能は、例えば複雑なAIアプリケーションを構築する際に役立つ:
- リアルタイムのデータにアクセスできるチャットボットの作成
- 特定のタスク(予約、問い合わせなど)を実行するインテリジェント・アシスタントを構築する。
- 精密な計算や複雑な演算が可能なAIシステムの開発
マルチモーダルモデル
Ollamaは、bakllavaやllavaのようなマルチモーダルモデルをサポートしています。マルチモーダルモデルとは、複数の種類の入力(テキスト、画像、音声など)を扱うことができるAIモデルのことです。これらのモデルは、クロスモーダルなコンテンツの理解と生成に優れており、より複雑で自然な人間とコンピュータのインタラクションを可能にします。
まず、マルチモーダルモデルをダウンロードする必要がある。コマンドラインで実行する:
オラマ・プルラバ
次に、以下のコードを使って画像とテキストの入力を処理することができる:
from langchain_ollama import ChatOllama
from langchain_core.messages import HumanMessage
from langchain_core.output_parsers import StrOutputParser
llm = ChatOllama(model="llava", temperature=0)
def prompt_func(data).
'''マルチモーダル入力を構築する''''
chain = prompt_func | llm | StrOutputParser().
query_chain = chain.invoke(
{"text": "この写真に写っている動物は?"画像": image_b64} )
)
ここで重要なのは
- 画像の前処理:画像をbase64エンコード文字列に変換する必要がある。
- ヒント機能:
プロンプトファンク
テキストと画像を含むマルチモーダル入力が作成される。 - 連鎖:次のように使う。
|
演算子は、ヒント関数、モデル、出力パーサーを接続する。
マルチモーダルモデルは、例えば多くの場面で役に立つ:
- 画像記述生成
- 視覚的質疑応答システム
- 画像ベースのコンテンツ分析と推薦
4.高度な使用法
ConversationChainを使った会話
カンバセーションチェーン
は、LangChainが提供する多ラウンドダイアログを管理するための強力なツールです。言語モデル、プロンプトテンプレート、インメモリコンポーネントを組み合わせることで、コンテキストを考慮した対話システムを簡単に構築することができます。
メモリ = ConversationBufferMemory()
会話 = ConversationChain(
llm=model、
memory=memory, verbose=True
冗長=真
)
# 会話を行う
response = conversation.predict(input="Hello, I'd like to learn about artificial intelligence.")
print("AI:", response)
response = conversation.predict(input="日常生活におけるAIの例を教えてください。")
print("AI:", response)
response = conversation.predict(input="面白そうですね。 医療におけるAIの応用例を教えてください。")
print("AI:", response)
ここで重要なのは
会話バッファメモリ
これは単純なインメモリーコンポーネントで、過去のすべての会話の履歴を保存します。カンバセーションチェーン
言語モデル、メモリ、デフォルトのダイアログ・プロンプト・テンプレートが組み合わされている。
対話の履歴を管理することは、モデルにとって重要である:
- 文脈と既出の情報を理解する
- より首尾一貫した適切な回答を生み出す
- 複雑な多ラウンド対話シナリオの処理
実際には、以下のような、より高度なメモリーコンポーネントの使用を検討する必要があるかもしれない。 会話要約メモリ
長いダイアログを扱い、モデルのコンテキストの長さの制限を超えないようにするためです。
カスタマイズされたプロンプトテンプレート
よく設計されたプロンプトテンプレートは、効率的なAIアプリケーションを作成するための鍵です。この例では、商品説明を生成するための複雑なプロンプトを作成しました:
system_message = SystemMessage(content="")
あなたは経験豊富なeコマースのコピーライティングの専門家です。あなたの仕事は、与えられた商品情報に基づいて魅力的な商品説明を作成することです。
簡潔で力強く、商品の主な利点を強調するような説明を心がけてください。
""")
human_message_template = """
次の商品の魅力的な商品説明を作成してください:
製品タイプ: {product_type}
主な特徴:{key_feature}。
ターゲットオーディエンス:{target_audience}
価格帯: {price_range}
ブランドポジショニング: {brand_positioning}
次の3つの異なるスタイルについて、それぞれ50字程度で説明してください:
1.合理的分析
2.感情的アピール
3.ストーリーテリング
"""
# 使用例
product_info = { { "product_type": "スマートウォッチ
"product_type": "スマートウォッチ"、
「key_feature": "心拍モニタリングと睡眠分析"、
「target_audience": "健康志向の若いプロフェッショナル"、
"brand_positioning": "テクノロジーと健康の完璧なコンビネーション"
}
この構造にはいくつかの重要な設計上の考慮点がある:
- system_prompt:AIの役割と全体的なタスクを定義し、対話全体のトーンを設定します。
- human_message_template: 具体的な指示と必要なメッセージの構造を提供する。
- マルチパラメータ設計:さまざまな製品や要件に柔軟に対応できます。
- 多様なアウトプットの要件:さまざまなスタイルの記述を要求することで、モデルの多様性を示すことを奨励する。
効果的なプロンプト・テンプレートをデザインする際には、以下の点を考慮してください:
- AIの役割と使命を明確に定義する
- 明確で構造化された入力フォーマットを提供する
- 具体的な出力要件とフォーマットガイダンス
- モデルの能力と創造性を最大限に引き出す方法を考える
シンプルなRAG Q&Aシステムの構築
RAG(Retrieval-Augmented Generation)とは、検索と生成を組み合わせ、関連情報を検索することで言語モデルの解答能力を増強するAI技術である。RAGシステムのワークフローには通常、以下のステップが含まれる:
- 知識ベース・ドキュメントをチャンクに分割し、ベクトル・インデックスを作成する。
- ユーザーの問題をベクトル化し、インデックスで関連文書を検索する。
- 検索された関連文書を、元の質問とともにコンテキストとして言語モデルに提供する。
- 言語モデルは、検索された情報に基づいて応答を生成する。
RAGの利点は、言語モデルが最新かつ専門的な情報にアクセスするのを助け、幻滅を減らし、回答の正確さと関連性を向上させることである。
LangChainはOllamaモデルとシームレスに統合できる様々なコンポーネントを提供しています。ここでは、Ollamaモデルをベクターストアとレトリバーと組み合わせて、シンプルなRAG質問応答システムを作る方法を紹介します。
これは、コマンドラインで以下のコマンドを実行することによって行うことができます:
ollama pull nomic-embed-text
そうすれば、RAGシステムを構築することができる:
# Ollamaモデルとエンベッディングの初期化
llm = ChatOllama(model="llama3.1")
embeddings = OllamaEmbeddings(model="nomic-embed-text")
# ドキュメントを準備する
text = ""
Datawhaleは、データサイエンスとAIの分野に特化したオープンソース組織で、この分野の多くの機関や有名企業から優秀な学習者が集まり、オープンソースと探求精神を持ったチームメンバーが集まっています。
Datawhaleは、「学習者のために、学習者と共に成長する」というビジョンを掲げ、真の自己表現、開放性と寛容性、相互信頼と相互支援、試行錯誤する勇気、責任を取る勇気を奨励しています。
同時に、Datawhaleはオープンソースの概念を使って、オープンソースコンテンツ、オープンソースラーニング、オープンソースソリューションを探求し、人材育成に力を与え、人材の成長を助け、人、知識、ビジネス、未来のつながりを確立します。
Datawhaleオープンソースコミュニティでオープンソースプロジェクトを立ち上げたい方は、Datawhaleオープンソースプロジェクトガイドラインを詳しくお読みください[https://github.com/datawhalechina/DOPMC/blob/main/GUIDE.md]。
"""
# テキストの分割
text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=20)
chunks = text_splitter.split_text(text)
# ベクトルストアの作成
vectorstore = FAISS.from_texts(chunks, embeddings)
retriever = vectorstore.as_retriever()
# プロンプトテンプレートを作成する
template = """質問は以下を使ってのみ回答できる。
{コンテキスト}
質問: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
# 検索-質問チェーンの作成
チェーン = (
{"コンテキスト": retriever, "質問": RunnablePassthrough()} | prompt
| プロンプト
| プロンプト
)
# chainを使って質問に答える
question = "datawhaleに貢献したい場合はどうすればいいですか?"
response = chain.invoke(質問)
このRAGシステムは以下のように機能する:
- テキスト・セグメンテーション:使用
再帰的文字テキスト分割器
長いテキストを小さなチャンクに分割する。 - ベクトル化と索引付け
オーラマ・エンべディング
テキストブロックをベクトルに変換し、FAISSでベクトルインデックスを作成します。 - 検索:質問を受信すると、システムは質問をベクトル化し、FAISSインデックス内の最も関連性の高いテキストブロックを検索します。
- 回答の生成:検索されたテキストの関連するチャンクは、最終的な回答を生成するために、元の質問とともに言語モデルに提供される。
RAGシステムは、例えば、現実の多くの場面で非常に役に立つ:
- カスタマーサービス:顧客からの問い合わせに、会社の知識ベースに基づいて迅速に回答することができる。
- 研究支援:研究者が関連文献をすばやく見つけ、重要な情報を要約するのに役立ちます。
- パーソナル・アシスタント:個人のメモとウェブ情報を組み合わせて、パーソナライズされた情報検索と提案を提供します。
評決を下す
これらの例を用いて、OllamaとLangChainを使って、単純な対話システムから複雑なRAG Q&Aシステムまで、様々なAIアプリケーションを構築する方法を紹介する。これらのツールとテクニックは、強力なAIアプリケーションを開発するための強固な基盤を提供します。
OllamaとLangChainの組み合わせは、開発者に大きな柔軟性と可能性を提供します。特定のニーズに応じて適切なモデルやコンポーネントを選択し、アプリケーションのシナリオに合ったAIシステムを構築することができます。
テクノロジーが進化し続けるにつれ、より革新的なアプリケーションが登場することが期待されます。このガイドが、AI開発の旅立ちの一助となり、AI技術の無限の可能性を探求するあなたの創造力を刺激することを願っています。