ローカルRAGセットアップのキックスタート:OllamaとMilvusでLlama 3 LangChainを使うための初心者ガイド

Llama 3、Mistral、GemmaなどのオープンソースLLMの台頭により、大規模言語モデル(LLM)はローカルで実行しても有用であることが明らかになってきた。このアプローチは実用的であるだけでなく、GPT-3やGPT-4のような商用LLMでスケールアップするとコストが高騰する可能性があるため、不可欠なものとなっている。
このハンズオンガイドでは、RAG(Retrieval Augmented Generation)を導入して、特定の情報に関する質問に答えることができる質問応答(Q&A)チャットボットを作成する方法を見ていきます。このセットアップでは、ベクトルストアとしてMilvusによって提供されるOllamaとLlama 3も使用します。典型的な実装では、Llama 3用のテキスト生成パイプラインをセットアップします。
この検索拡張生成(ラグ)セットアップを構築するためのさまざまなツールには、以下のようなものがある:
Ollama](https://ollama.com/):Ollamaは、ローカルマシン上でLlama 3を管理できるオープンソースツールです。LLMのパワーをあなたのラップトップにもたらし、ローカルでの操作を簡素化します。
LangChain](https://github.com/langchain-ai/langchain)LangChainはLLMを使ったアプリケーションの開発を簡単にするフレームワークです。エージェントを作成し、データと対話するために使用します。
LangChainは、あなたの関連データを効率的に保存・取得するために使用するベクトルデータベースです。
Llama 3](https://llama.meta.com/llama-downloads)はMetaによって開発されたオープンソースの大規模言語モデルで、LLMのラインナップの最新の反復です。ユーザーとの対話のための複雑なプロンプトフォーマットを提供し、「システム」、「ユーザー」、「アシスタント」を含む複数のユーザーの役割をサポートする。
RAGとのQ&A
私たちはRAG(Retrieval Augmented Generation:検索拡張世代)を使って、洗練された質問応答(Q&A)チャットボットを構築します。これにより、特定の情報に関する質問に答えることができるようになります。
検索拡張世代とは何ですか?
RAG(Retrieval Augmented Generation)は、追加のデータソースを統合することでLLMを強化する技術です。典型的なRAGアプリケーションには以下のようなものがある:
インデックス作成** - ソースからデータを取り込み、インデックスを作成するパイプライン。Milvusに格納されたデータはvector embeddingsの形で表現されます。エンベッディングはコンテンツの本質を捉え、キーワード検索に比べてより関連性の高い検索結果を可能にする。
検索と生成** - 検索拡張生成システムは、ベクトル・データベースから関連するコンテキストを取得し、回答を生成する前にそれをLLMに渡すことで、回答の質を向上させる。文脈が与えられると、LLMは幻覚の生成を避ける。より具体的には、RAGは実行時にユーザーのクエリを処理し、Milvusに格納されたインデックスから関連データを取得し、LLMはこのエンリッチされたコンテキストに基づいて応答を生成する。
本ガイドは、RAGアプリケーションをセットアップするためにローカルLLMをどのように使用できるかを紹介する、実践的かつ実践的な内容となっている。このガイドブックは専門家のためだけのものではありません。初心者の方でも、自分のQ&Aチャットボットを作り始めることができます。さあ、始めましょう!
前提条件
チュートリアルの各コンポーネントのセットアップを始める前に、お使いのシステムに以下の環境が整っていることを確認してください:
- Docker & Docker-Compose** - DockerとDocker-Composeがシステムにインストールされていることを確認してください。 Docker & Docker-Compose** - DockerとDocker-Composeがシステムにインストールされていることを確認してください。 Milvus Standalone - 今回の目的では、Docker Composeで簡単に管理できるMilvus Standaloneを使用します。
- Ollama** - あなたのシステムにOllamaをインストールしてください。最新のインストールガイドはウェブサイトを参照してください。
##ラングチェーンセットアップ
すべての前提条件をインストールしたら、RAGアプリケーションをセットアップする準備ができました:
- Milvus Standaloneインスタンスを起動します:docker-compose up -d.`
- このコマンドはMilvusインスタンスをデタッチモードで起動し、バックグラウンドで静かに実行します。
- LLMモデルを取得する:LLM モデルの取得:
ollama pull <name_of_model>
.- 利用可能なモデルのリストをlibraryから表示する。
- 例えば
ollama pull llama3
などです。
- このコマンドはモデルのデフォルト(通常は最新かつ最小)のバージョンをダウンロードします。
- コマンドラインからモデルと直接チャットするには
ollama run <モデル名>
を使ってください。
ベクターストアの依存関係のインストール
このアプリケーションを実行するには、Pythonライブラリをインストールする必要がある。Githubのコードを直接使う場合はPoetryを使うか、pip
を使ってインストールする。
pip install langchain pymilvus ollama pypdf langchainhub langchain-community langchain-experimental
llm搭載アプリケーション用RAGアプリケーション
先に述べたように、RAGの主要なコンポーネントの一つはデータのインデックス付けです。
1.PyPDFLoaderを使ってPDFからデータを取り込みます。
from langchain_community.document_loaders import PyPDFLoader
loader = PyPDFLoader(
"https://d18rn0p25nwr6d.cloudfront.net/CIK-0001813756/975b3e9b-268e-4798-a9e4-2a9a7c92dc10.pdf"
)
data = loader.load()
2.データを分割する
読み込んだデータは `RecursiveCharacterTextSplitter `` を使って管理しやすい大きさに分割する。
from langchain.text_splitter import RecursiveCharacterTextSplitter ``` を使います。
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0)
all_splits = text_splitter.split_documents(data)
3.埋め込みデータの取得とMilvusへの格納
次に、テキストデータをJina AI's Small English embeddingsを用いてベクトル埋め込みに変換し、Milvusに格納する。
from langchain_community.embeddings.jina import JinaEmbeddings
from langchain.vectorstores.milvus import Milvus
embeddings = JinaEmbeddings(
jina_api_key=JINA_AI_API_KEY, model_name="jina-embeddings-v2-small-ja"
)
vector_store = Milvus.from_documents(documents=all_splits, embedding=embeddings)
4.LLMのロード
Ollamaでは、LLMをローカルに読み込んで使用することが簡単にできます。この例では、Llama 3 by Metaを使います:
from langchain_community.llms import Ollama
from langchain.callbacks.manager import CallbackManager
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
llm = Ollama(
model="llama3"、
callback_manager=CallbackManager(
[StreamingStdOutCallbackHandler()] を参照してください。
),
stop=["<|eot_id|>"]、
)
5.LangchainでQAチェーンを構築する
最後に、ユーザーからの問い合わせを処理し、応答するためのQAチェーンを構築します:
from langchain import hub
from langchain.chains import RetrievalQA
query = input("\nQuery: ")
prompt = hub.pull("rlm/rag-prompt")
qa_chain = RetrievalQA.from_chain_type(
llm, retriever=vectorstore.as_retriever(), chain_type_kwargs={"prompt": prompt} )
)
result = qa_chain({"query": query})
print(result)
アプリケーションの実行
RAGアプリケーションを実行します。
RAG アプリケーションを実行します: python rag_ollama.py ` を実行してください。
QAインタラクションの例:
クエリこの文書は何についての文書ですか?
このドキュメントはSEC提出用の104 Cover Page Interactive Data Fileのようだ。会社の財務諸表と証明書に関する情報が含まれています。{'query': 'What is this document about?"このドキュメントは、SEC提出用の104 Cover Page Interactive Data Fileのようです。会社の財務諸表と証明書に関する情報が含まれています。}
これで完成だ!OllamaとLlama 3、Langchain、Milvusを使って、洗練されたローカルLLMをセットアップしたところだ。このセットアップにより、大規模なデータセットを効率的に扱うことが可能になるだけでなく、非常に応答性の高いローカル質問応答システムを実現することができます。
Milvus](https://zilliz.com/what-is-milvus)やGithubにあるコードを自由にチェックし、Discordに参加してコミュニティと経験を共有してください。
検索されたコンテキストのまとめ
このガイドでは、ローカルの大規模言語モデル(LLM)を使用した検索拡張生成(RAG)アプリケーションをセットアップするためのウォークスルーを提供した。Ollama、Llama 3、LangChain、Milvusのようなツールを活用することで、ベクターストアから取得したコンテキストを使用して特定の情報クエリを処理できる強力な質問応答(Q&A)チャットボットを作成する方法を示しました。
主なポイントは以下の通りです:
RAGの概要**:RAGは外部データソースを統合することでLLMの機能を強化します。Milvusを使用してデータをベクトル埋め込みにインデックス化し、クエリ処理中に関連するコンテキストを取得することで、正確で情報に基づいた応答を生成します。
ツールハイライト
Ollama**はLlama 3モデルのローカルでの管理と実行を簡素化します。
LLM ベースのアプリケーションを開発するための直感的なフレームワークを提供します。
Milvus**はベクトルストアとして、ベクトル化されたデータを効率的に格納・検索し、正確なクエリ処理を可能にします。
Metaによって開発されたLlama 3は、マルチ・ロール・インタラクションやカスタマイズ可能なシステム・プロンプトのような機能で高度な機能をサポートしています。
セットアップ・プロセスには重要なステップが含まれている:
1.**前提条件Docker、Milvus Standalone、Ollama、必要なPythonライブラリのインストール。
2.**データのインデックス作成PyPDFLoaderやRecursiveCharacterTextSplitterのようなツールを使ってデータをロード、分割、ベクトル化する。
3.埋め込みストレージ:JinaのAIモデルでtext into embeddingsを変換し、Milvusのベクトルストアに格納する。
4.QAチェーンの構築:LangChainを通じてLlama 3とベクトルストアを統合し、ユーザーからの問い合わせを処理し、応答するためにカスタマイズされたシステムプロンプトを構成する。
アプリケーションを実行することで、ユーザーはローカルのチャットボットと対話し、特定のデータセットから正確で文脈に関連した回答を取得することができる。関連文書が検索されると、効果的な方法であることが証明されている回答生成のためにLLMに渡されます。ガイドは実用性を重視し、初心者と専門家の両方がアクセスできるようにした。最適な検索を行うためには、アプリケーションの仕様に基づいてパラメータを微調整する必要があることを覚えておいてほしい。
オープンソースのLLMがますます注目される中、このセットアップは、ローカライズされた実装がいかにコストを削減し、セキュリティを強化し、情報検索と生成のためのスケーラブルなソリューションを提供するかを強調している。GitHub リポジトリを探索し、私たちの Discord コミュニティに参加して、あなたの経験や洞察を共有してください!
読み続けて

Build RAG with LangChainJS, Milvus, and Strapi
A step-by-step guide to building an AI-powered FAQ system using Milvus as the vector database, LangChain.js for workflow coordination, and Strapi for content management

GLiNER: Generalist Model for Named Entity Recognition Using Bidirectional Transformer
GLiNER is an open-source NER model using a bidirectional transformer encoder.

Stop Waiting, Start Building: Voice Assistant With Milvus and Llama 3.2
We'll learn to build a Voice Assistant, a specialized Agentic RAG system designed for voice interactions, with Milvus, Llama 3.2, and other GenAI tools.