簡単
この文書では オーラマ Ollamaは大規模な言語モデルのためのオープンソースのデプロイツールであり、LangChainは言語モデルベースのアプリケーションを構築するためのフレームワークです。この2つを組み合わせることで、高度なAIモデルをローカル環境に迅速に展開し、利用することができる。
注:この文書には、核となるコードの断片と詳細な説明が含まれています。完全なコードはこのJupyterノートブックで発見された。
1.環境設定
Conda環境の設定
まず、JupyterでConda環境を使う必要がある。コマンドラインから以下のコマンドを実行する:
conda create -n handlm python=3.10 -y
conda activate handlm
pip install jupyter
python -m ipykernel install --user --name=handlm
実行後、Jupyterを再起動し、その環境のカーネルを選択してください:
⚠️ 注
注目してほしい: condaの仮想環境を使わずに、グローバル環境を直接使用することも可能です。
依存関係のインストール
始める前に、以下のパッケージをインストールする必要がある:
langchain-ollama
OllamaモデルをLangChainフレームワークに統合する。langchain
LangChainのコア・ライブラリは、AIアプリケーションを構築するためのツールと抽象化を提供します。langchain-community
コミュニティから提供された様々な統合やツールを含むPillow
マルチモーダルなタスクで使用される画像処理用faiss-cpu
シンプルな建築用 ラグ レトリーバー
以下のコマンドでインストールできる:
pip install langchain-ollama langchain langchain-community Pillow faiss-cpu
2.必要なモデルをダウンロードし、OllamaLLMを初期化する。
llama3.1 モデルのダウンロード
- 公式ウェブサイトhttps://ollama.com/download、Ollamaをダウンロードし、対応プラットフォームにインストールしてください。
- 利用可能な全モデルについては、https://ollama.ai/library。
- とおす
ollama pull <name-of-model>
コマンドを使用して、利用可能なLLMモデルを取得することができます(例:ollama pull llama3.1
).
コマンドラインは図のように実行される:
モデルの保管場所
- マックだ。
~/.ollama/models/
- Linux(またはWSL)。
/usr/share/ollama/.ollama/models
- ウィンドウズ
C:\Users\Administrator\.ollama\models
3.基本的な使用例
ChatPromptTemplateを使って会話をする
ChatPromptTemplateを使用すると、1つ以上のパラメータを持つ再利用可能なテンプレートを作成することができます。これらのパラメータは、異なるプロンプトを生成するために実行時に動的に置き換えることができます。
template = """
你是一个乐于助人的AI,擅长于解决回答各种问题。
问题:{question}
"""
prompt = ChatPromptTemplate.from_template(template)
chain = prompt | model
chain.invoke({"question": "你比GPT4厉害吗?"})
Create Chainセクションで、パイプ演算子 |
プロンプトとモデルをつなげて処理の流れを形成する。この連鎖により、異なるコンポーネントの組み合わせや再利用が容易になる。
invoke
メソッドは処理チェーン全体をトリガーし、私たちの質問をテンプレートに渡し、処理のためにフォーマットされたプロンプトをモデルに送ります。
ストリーミング出力
ストリーミング出力は、長いテキストを生成するときに結果をインクリメンタルに返す手法である。この方法にはいくつかの重要な利点がある:
- ユーザーエクスペリエンスの向上:ユーザーは、回答全体が完了するまで待つのではなく、部分的な結果をすぐに見ることができます。
- 待ち時間の短縮:長い回答の場合、完全な回答が生成される前に読み始めることができます。
- リアルタイム・インタラクション:生成プロセス中の介入や終了が可能。
実際には、特にチャットボットやリアルタイムの対話システムでは、ストリーミング出力はほとんど不可欠だ。
from langchain_ollama import ChatOllama
model = ChatOllama(model="llama3.1", temperature=0.7)
messages = [
("human", "你好呀"),
]
for chunk in model.stream(messages):
print(chunk.content, end='', flush=True)
model.stream()
メソッドはOllama APIのストリーミング出力インターフェースのラッパーで、ジェネレーター・オブジェクトを返します。メソッドを呼び出すと model.stream(messages)
そうすると、以下の操作が完了する:
- Ollama API にリクエストを送信し、レスポンスの生成を開始します。
- APIはテキストを生成し始めるが、それがすべて生成されるまで待つのではなく、小さなチャンクに分けて返す。
- 受信した各小部分のテキストに対して
stream()
メソッドはテキストのブロックを生成する。 flush=True
各クリップは、バッファがいっぱいになるのを待つのではなく、すぐに表示されるようにする。
ツールコール
ツール・コールとは、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("你知道一千万乘二是多少吗?")
bind_tools
メソッドによって、モデルにカスタム関数を登録することができる。こうすることで、モデルが計算を必要とする問題に遭遇したとき、事前学習の知識に頼るのではなく、この関数を呼び出して正確な結果を得ることができる。
この機能は、例えば複雑なAIアプリケーションを構築する際に役立つ:
- リアルタイムのデータにアクセスできるチャットボットの作成
- 特定のタスク(予約、問い合わせなど)を実行するインテリジェント・アシスタントを構築する。
- 精密な計算や複雑な演算が可能なAIシステムの開発
マルチモーダルモデル
Ollamaは、bakllavaやllavaのようなマルチモーダルモデルをサポートしています。マルチモーダルモデルとは、複数の種類の入力(テキスト、画像、音声など)を扱うことができるAIモデルのことです。これらのモデルは、クロスモーダルなコンテンツの理解と生成に優れており、より複雑で自然な人間とコンピュータのインタラクションを可能にします。
まず、マルチモーダルモデルをダウンロードする必要がある。コマンドラインで実行する:
ollama pull llava
次に、以下のコードを使って画像とテキストの入力を処理することができる:
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": image_b64}
)
ここで重要なのは
- 画像の前処理:画像をbase64エンコード文字列に変換する必要がある。
- ヒント機能:
prompt_func
テキストと画像を含むマルチモーダル入力が作成される。 - 連鎖:次のように使う。
|
演算子は、ヒント関数、モデル、出力パーサーを接続する。
マルチモーダルモデルは、例えば多くの場面で役に立つ:
- 画像記述生成
- 視覚的質疑応答システム
- 画像ベースのコンテンツ分析と推薦
4.高度な使用法
ConversationChainを使った会話
ConversationChain
は、LangChainが提供する多ラウンドダイアログを管理するための強力なツールです。言語モデル、プロンプトテンプレート、インメモリコンポーネントを組み合わせることで、コンテキストを考慮した対話システムを簡単に構築することができます。
memory = ConversationBufferMemory()
conversation = ConversationChain(
llm=model,
memory=memory,
verbose=True
)
# 进行对话
response = conversation.predict(input="你好,我想了解一下人工智能。")
print("AI:", response)
response = conversation.predict(input="能给我举个AI在日常生活中的应用例子吗?")
print("AI:", response)
response = conversation.predict(input="这听起来很有趣。AI在医疗领域有什么应用?")
print("AI:", response)
ここで重要なのは
ConversationBufferMemory
これは単純なインメモリーコンポーネントで、過去のすべての会話の履歴を保存します。ConversationChain
言語モデル、メモリ、デフォルトのダイアログ・プロンプト・テンプレートが組み合わされている。
対話の履歴を管理することは、モデルにとって重要である:
- 文脈と既出の情報を理解する
- より首尾一貫した適切な回答を生み出す
- 複雑な多ラウンド対話シナリオの処理
実際には、以下のような、より高度なメモリーコンポーネントの使用を検討する必要があるかもしれない。 ConversationSummaryMemory
長いダイアログを扱い、モデルのコンテキストの長さの制限を超えないようにするためです。
カスタマイズされたプロンプトテンプレート
よく設計されたプロンプトテンプレートは、効率的なAIアプリケーションを作成するための鍵です。この例では、商品説明を生成するための複雑なプロンプトを作成しました:
system_message = SystemMessage(content="""
你是一位经验丰富的电商文案撰写专家。你的任务是根据给定的产品信息创作吸引人的商品描述。
请确保你的描述简洁、有力,并且突出产品的核心优势。
""")
human_message_template = """
请为以下产品创作一段吸引人的商品描述:
产品类型: {product_type}
核心特性: {key_feature}
目标受众: {target_audience}
价格区间: {price_range}
品牌定位: {brand_positioning}
请提供以下三种不同风格的描述,每种大约50字:
1. 理性分析型
2. 情感诉求型
3. 故事化营销型
"""
# 示例使用
product_info = {
"product_type": "智能手表",
"key_feature": "心率监测和睡眠分析",
"target_audience": "注重健康的年轻专业人士",
"price_range": "中高端",
"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 以" for the learner,和学习者一起成长"为愿景,鼓励真实地展现自我、开放包容、互信互助、敢于试错和勇于担当。
同时 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 = """只能使用下列内容回答问题:
{context}
Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
# 创建检索-问答链
chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| llm
)
# 使用链回答问题
question = "我想为datawhale贡献该怎么做?"
response = chain.invoke(question)
このRAGシステムは以下のように機能する:
- テキスト・セグメンテーション:使用
RecursiveCharacterTextSplitter
長いテキストを小さなチャンクに分割する。 - ベクトル化と索引付け
OllamaEmbeddings
テキストブロックをベクトルに変換し、FAISSでベクトルインデックスを作成します。 - 検索:質問を受信すると、システムは質問をベクトル化し、FAISSインデックス内の最も関連性の高いテキストブロックを検索します。
- 回答の生成:検索されたテキストの関連するチャンクは、最終的な回答を生成するために、元の質問とともに言語モデルに提供される。
RAGシステムは、例えば、現実の多くの場面で非常に役に立つ:
- カスタマーサービス:顧客からの問い合わせに、会社の知識ベースに基づいて迅速に回答することができる。
- 研究支援:研究者が関連文献をすばやく見つけ、重要な情報を要約するのに役立ちます。
- パーソナル・アシスタント:個人のメモとウェブ情報を組み合わせて、パーソナライズされた情報検索と提案を提供します。
評決を下す
これらの例を用いて、OllamaとLangChainを使って、単純な対話システムから複雑なRAG Q&Aシステムまで、様々なAIアプリケーションを構築する方法を紹介する。これらのツールとテクニックは、強力なAIアプリケーションを開発するための強固な基盤を提供します。
OllamaとLangChainの組み合わせは、開発者に大きな柔軟性と可能性を提供します。特定のニーズに応じて適切なモデルやコンポーネントを選択し、アプリケーションのシナリオに合ったAIシステムを構築することができます。
テクノロジーが進化し続けるにつれ、より革新的なアプリケーションが登場することが期待されます。このガイドが、AI開発の旅立ちの一助となり、AI技術の無限の可能性を探求するあなたの創造力を刺激することを願っています。