研修で使うPython文法を6つに絞って体験し、ChatOpenAIでLLMを呼び出し、Prompt TemplatesとLCELでChainを組む。3つのトピックで「生成」側の基盤を作る。
python 01_python_basics.py を実行
name = "RAG研修" のように値を変数に入れて使い回す。LangChainではモデル名やプロンプトの格納に使う。
def greet(name): のように処理をまとめる。LangGraphのNodeは関数として定義する。
{"question": "RAGとは?"} のキーと値のペア。LangGraphのStateは辞書で表現される。
["文書A", "文書B"] の形。RAGの検索結果はリストで返ってくる。
from langchain_openai import ChatOpenAI のように外部ライブラリを読み込む。
f"{product}のバージョンは{version}です" で変数を文字列に埋め込む。
Pythonには標準で備わっている機能(printなど)以外に、世界中の開発者が作った追加機能(ライブラリ)がある。import文はそれらを「今から使います」と宣言する命令。from langchain_openai import ChatOpenAI は「langchain_openaiパッケージの中にあるChatOpenAIという部品を取り出す」という意味になる。
| Python文法 | 研修での使用場面 |
|---|---|
| 変数 | モデル名、API設定値、プロンプトの格納 |
| 関数 | LangGraphのNode定義 |
| 辞書 | LangGraphのState |
| リスト | RAGの検索結果の格納・取り出し |
| import | LangChain各コンポーネントの読み込み |
| f文字列 | Prompt templatesでの変数埋め込み |
各ブロックの後にコメントアウトされた練習問題がある。コメントを外して ___ を埋めて実行する形式。
python 02_chat_models.py を実行
load_dotenv() ── .envファイルからOPENAI_API_KEYを読み込み、プログラムが使える状態にするChatOpenAI(model="gpt-4o-mini") ── OpenAI APIを呼び出すための「電話機」を準備する。まだ電話はかけていないmodel.invoke("こんにちは") ── ここで実際にインターネット経由でOpenAIのサーバーに「こんにちは」というテキストを送信する。サーバー側のGPT-4o-miniが回答を生成し、それが返ってくるresponse.content ── 返ってきた回答オブジェクトの中から、テキスト部分だけを取り出すこの一連の流れで数秒かかるのは、インターネット通信が発生しているため。
model.invoke("テキスト") がLLMへの質問窓口。この1行がLangChainの出発点になる。
RAGでは正確性が求められるため temperature=0 を使う場面が多い。
OpenAI Text Generation Guide / OpenAI Tokenizer: 文章が何トークンになるか試せるツール
10分休憩の後、このセクションに入る。
python 03_prompt_and_lcel.py を実行
毎回 f"iPhoneの特徴を3個教えてください" のように文字列を手書きしてもLLMは呼べる。だが、実際のシステムでは質問内容が毎回変わる。ChatPromptTemplateは{product}や{count}の部分を変数にして、あとから値を差し込める「テンプレート」を作る仕組み。ExcelでいうところのVLOOKUPのような差し込み機能に近い。
ChatGPTの画面では見えないが、裏側では「system」「human」「assistant」という3種類のメッセージが区別されている。
RAGでは、systemメッセージに「以下の文書を参考に回答してください」と書くことで、AIが検索結果に基づいて回答するよう制御する。これがRAGの「生成」側の核心にあたる。
RAGでは「以下の文書を参考に回答してください」というSystemMessageを設定し、AIの振る舞いを制御する。
prompt | model | parser は「工場の流れ作業」と同じ。1番目の工程(prompt)で材料を準備し、2番目の工程(model)でAIが加工し、3番目の工程(parser)で出荷用に整える。Linuxのコマンドラインで ls | grep ".py" のようにパイプで繋ぐのと同じ発想。LangChainではこの書き方をLCEL(LangChain Expression Language)と呼ぶ。
この chain = prompt | model | parser が研修で最も使われるパターン。最終演習のgenerate_nodeでもこの形が登場する。
パイプ演算子 | はPythonの __or__ メソッドを利用している。LangChainのRunnableクラスがこれをオーバーライドし、左の出力を右の入力に渡すChainを構築する。