🎅

RAGのTutorialやってみた part2

2024/12/19に公開

前回したこと

  • RAGの概要
  • conda環境構築
  • openaiのapi_keyを取得
  • 課金

今回

今回は実際にライブラリをインストールして実際にlangchainを使用していきます。
langchainは前回説明した文章の読み込みであったり,分割、インデックス貼りなどそれらを簡単に実装するためのツールです。様々なクラスやメソッドがあるようでどれをどう使えば良いかわかりづらいです。
ここではチュートリアルと通して、それぞれのクラスの役割であったりを解説しながら、langchainを理解していきたいと思います。

Installation

vscdodeを開き、上のターミナルかCtrl+Shift+^でvscode上でターミナルも開いておきます。
前回作ったconda環境rag_tutorialに入ります
ターミナル上で
$ conda activate rag_tutorial
と打ちます。
langchainというライブラリをinstallする必要があるので
conda install langchain-text-splitters langchain-community -c conda-forge
を実行します。
これで基本的なライブラリをinstallすることができました。

LangChain・LanghSmith・LangGraph

これらはよくRAGを作成する際に出てくるワードなのでここで一旦整理しておきたいと思います。

  • LangChain:LangChainは、RAG構築の中核となるフレームワークでベースとなる骨組みを実装する
    • LLMの統合
      • GPTやOpenAI API、Hugging Faceのモデルを組み込む
      • LLMのプロンプト設計やカスタマイズ
    • データ取得
      • ベクトルデータベースとの統合
      • RAGで必要とされる検索から応答までの流れを実装
  • LangSmith:LangChainで構築したRAGの動作を「分析・改善」
    • デバッグ:作成したRAGにtest入力を与えて、期待通りの出力が得られるか
    • 品質最適化:RAGのプロンプト(どういう形式の出力でどういう背景で〜)のような設定を科す
    • 検索評価:Aという入力に近いものをk件取得するときにどの程度近いものを取得できているかなどを定量化する
  • LangGraph:RAGの複雑なワークフローを「視覚的に管理・最適化」する
    • ワークフローの設計
      • RAGのプロセス(検索 → 応答生成 → フィードバック)をグラフ形式で整理
      • 各ステップの役割やデータの流れを直感的に把握可能
    • フローのデバッグ
      • どのステップで問題が生じているかなど

LangSmith

まずLangSmithにアクセスしてLangSmithにログインしましょう
https://smith.langchain.com/
ログインが終了すると以下のような画面が出てくるので、apikeyを発行しましょう。このapikeyはlangchain用のapikeyですので、前回作成したopenaiのapikeyとは別物です。langchainが提供しているapiを使用する際に必要です。これも前回同様何処かに控えておきましょう。

さらに今回はopenaiのapiを使用するので
pip install -U langchain langchain-openai
とrag_tutorial環境でinstallしておきましょう。

ChatModel・EMbeddings・VectorStoreのインスタンス化

適当にipynbファイルを作成して

import getpass
import os

os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()

とjupyter上のコードブロック上に記述しShift+Enterで実行します。すると、vscode画面上部にLangSmithで設定したAPIKEYの入力を求められるのでコピペで入力してください。これによって、ipynbの実行中にだけ環境変数を設定できます。getpassというライブラリがこの入力をさせています。
カーネルを再起動するともう一度環境変数を設定し直す必要があります。

次にこれを実行します

import getpass
import os

if not os.environ.get("OPENAI_API_KEY"):
  os.environ["OPENAI_API_KEY"] = getpass.getpass("Enter API key for OpenAI: ")

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o-mini")

ここでも、先ほど同様、openaiのapiのapikeyの入力を求められるの入力してください。
ChatOpenAIというクラスがllm(いわゆるchatGPTの質問→返答を担う)のインスタンスです。

以下のコードを実行します

import getpass
import os

if not os.environ.get("OPENAI_API_KEY"):
  os.environ["OPENAI_API_KEY"] = getpass.getpass("Enter API key for OpenAI: ")

from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings(model="text-embedding-3-large")

ここでは文字を数字へ変換するためのOpenAIEmbeddingsというクラスを使用しています。モデルはtext-embedding-3-largeというモデルです。これによってこの変換機能を持つインスタンスを作成することができました。

以下のコードを実行してください
rag_tutorial環境でpip install -qU langchain-coreをターミナル上で実行しinstallしてください。そして以下のコードを実行してください。jupyterを使用していると再度カーネルを起動し直す必要があるかもしれませんので、上の更新ボタン(表示されていないなら、・・・のようなマークをクリックし、再起動を押してください)これによってインストールしたライブラリを使用することができます。(今までのを全て実行しなす必要がある)そして以下を実行してください

from langchain_core.vectorstores import InMemoryVectorStore

vector_store = InMemoryVectorStore(embeddings)

これは、vector_storeをローカルで作成しています。ベクターストアはワードを数字(センテンスをベクトル)に変換し、それにindexをつけて保存するためのものです。InMemoryVectorStoreは変換用のインスタンスであるembeddingsを受け取っています。これによってvector_storeインスタンスは埋め込みができるようになります。おそらくembeddingsは複数の種類があって決まったInterfaceを実装していれば、別クラスのEmbeddingsも対応できるのでしょう。

ここまでで
*質問が来たら返答をするチャット用のインスタンス: llm
*受け取ったセンテンスをベクトルへ変換するインスタンス: embeddings
*ベクトルを保存するインスタンス: vectore_store
を揃えました。

今回はここまでです。何か疑問点や間違いがあれば遠慮なく指摘していただけると幸いです。
次回実際にweb上のドキュメントデータからドキュメントを取得してRAGを動かしてみます、オヒブヒ

part2
https://zenn.dev/kurutazoku/articles/ba04f270e7f3c8

Discussion