SESSION 02

Python基礎
LangChain入門

研修で使うPython文法を6つに絞って体験し、ChatOpenAIでLLMを呼び出し、Prompt TemplatesとLCELでChainを組む。3つのトピックで「生成」側の基盤を作る。

9:50 - 10:45(55分)
実践 3トピック
HANDS-ON 01 / 25 MIN
Python基礎 ── 研修で使う6つの文法
ファイル: 01_python_basics.py
EXERCISE

Python基礎スクリプトを実行する

python 01_python_basics.py を実行

BLOCK 01

変数と文字列

name = "RAG研修" のように値を変数に入れて使い回す。LangChainではモデル名やプロンプトの格納に使う。

BLOCK 02

関数

def greet(name): のように処理をまとめる。LangGraphのNodeは関数として定義する。

BLOCK 03

辞書(dict)

{"question": "RAGとは?"} のキーと値のペア。LangGraphのStateは辞書で表現される。

BLOCK 04

リスト

["文書A", "文書B"] の形。RAGの検索結果はリストで返ってくる。

BLOCK 05

import文

from langchain_openai import ChatOpenAI のように外部ライブラリを読み込む。

BLOCK 06

f文字列

f"{product}のバージョンは{version}です" で変数を文字列に埋め込む。

importは何をしているのか

Pythonには標準で備わっている機能(printなど)以外に、世界中の開発者が作った追加機能(ライブラリ)がある。import文はそれらを「今から使います」と宣言する命令。from langchain_openai import ChatOpenAI は「langchain_openaiパッケージの中にあるChatOpenAIという部品を取り出す」という意味になる。

Python文法研修での使用場面
変数モデル名、API設定値、プロンプトの格納
関数LangGraphのNode定義
辞書LangGraphのState
リストRAGの検索結果の格納・取り出し
importLangChain各コンポーネントの読み込み
f文字列Prompt templatesでの変数埋め込み
練習問題の進め方

各ブロックの後にコメントアウトされた練習問題がある。コメントを外して ___ を埋めて実行する形式。

HANDS-ON 02 / 30 MIN
Chat Models ── PythonからLLMを呼び出す
ファイル: 02_chat_models.py
EXERCISE

Chat Modelsスクリプトを実行する

python 02_chat_models.py を実行

Step 1 ── 最もシンプルなLLM呼び出し
# .envファイルからAPIキーを読み込む from dotenv import load_dotenv from langchain_openai import ChatOpenAI load_dotenv() model = ChatOpenAI(model="gpt-4o-mini") response = model.invoke("こんにちは") print(response.content)
  1. load_dotenv() ── .envファイルからOPENAI_API_KEYを読み込み、プログラムが使える状態にする
  2. ChatOpenAI(model="gpt-4o-mini") ── OpenAI APIを呼び出すための「電話機」を準備する。まだ電話はかけていない
  3. model.invoke("こんにちは") ── ここで実際にインターネット経由でOpenAIのサーバーに「こんにちは」というテキストを送信する。サーバー側のGPT-4o-miniが回答を生成し、それが返ってくる
  4. response.content ── 返ってきた回答オブジェクトの中から、テキスト部分だけを取り出す

この一連の流れで数秒かかるのは、インターネット通信が発生しているため。

OpenAI Chat API Reference

この1行がLangChainの出発点

model.invoke("テキスト") がLLMへの質問窓口。この1行がLangChainの出発点になる。

Step 2 ── temperatureパラメータ
# temperature=0: 毎回同じ回答(確定的) model_stable = ChatOpenAI(model="gpt-4o-mini", temperature=0) # temperature=1: 毎回違う回答(創造的) model_creative = ChatOpenAI(model="gpt-4o-mini", temperature=1)
RAGではtemperature=0が基本

RAGでは正確性が求められるため temperature=0 を使う場面が多い。

  • temperature=0 : 最も確率の高いトークンを常に選択。FAQ応答やRAGに適する
  • temperature=0.3-0.5 : 安定しつつ少し揺らぎがある。要約やレポート生成向き
  • temperature=0.7-1.0 : 多様な表現が出る。ブレスト、クリエイティブ用途向き
  • トークン = LLMが文章を処理する最小単位。日本語では1文字が1〜3トークン程度、英語では1単語が1〜2トークン
  • LLMは「次のトークンとして何が来る確率が高いか」を計算して文章を生成する。「東京の首都は...」の次に「日本」が来る確率は高く、「バナナ」が来る確率は低い
  • temperature=0 は確率が最も高いトークンを常に選ぶ設定。同じ質問をすれば同じ答えが返る
  • temperature=1 は確率が低いトークンも選ばれやすくなる設定。毎回違った表現が出てくる
  • RAGシステムでは情報の正確性が求められるため、temperature=0が基本となる

OpenAI Text Generation Guide  /  OpenAI Tokenizer: 文章が何トークンになるか試せるツール

HANDS-ON 03 / 25 MIN
Prompt Templates と LCEL ── Chain を組む
ファイル: 03_prompt_and_lcel.py

10分休憩の後、このセクションに入る。

EXERCISE

Prompt Templates スクリプトを実行する

python 03_prompt_and_lcel.py を実行

Step 1 ── ChatPromptTemplate
from langchain_core.prompts import ChatPromptTemplate prompt = ChatPromptTemplate.from_template( "{product}の特徴を{count}個教えてください。" ) message = prompt.invoke({"product": "iPhone", "count": 3})
Prompt Templateを使う理由

毎回 f"iPhoneの特徴を3個教えてください" のように文字列を手書きしてもLLMは呼べる。だが、実際のシステムでは質問内容が毎回変わる。ChatPromptTemplateは{product}や{count}の部分を変数にして、あとから値を差し込める「テンプレート」を作る仕組み。ExcelでいうところのVLOOKUPのような差し込み機能に近い。

Step 2 ── SystemMessage
prompt_with_system = ChatPromptTemplate.from_messages([ ("system", "あなたは親切な日本語アシスタントです。回答は3行以内にまとめてください。"), ("human", "{question}") ])

ChatGPTの画面では見えないが、裏側では「system」「human」「assistant」という3種類のメッセージが区別されている。

  • system ── AIの振る舞いを指定する指示書。「あなたは○○の専門家です」「回答は3行以内で」など。ユーザーには見えない裏設定
  • human ── ユーザー(人間)からの入力。ChatGPTでいう「入力欄に打つ文章」
  • assistant ── AIからの回答

RAGでは、systemメッセージに「以下の文書を参考に回答してください」と書くことで、AIが検索結果に基づいて回答するよう制御する。これがRAGの「生成」側の核心にあたる。

OpenAI Text Generation Guide

SystemMessageがRAGの要になる

RAGでは「以下の文書を参考に回答してください」というSystemMessageを設定し、AIの振る舞いを制御する。

Step 3 ── LCELでChainを組む
from langchain_core.output_parsers import StrOutputParser chain = prompt | model | StrOutputParser() result = chain.invoke({"product": "LangChain", "count": 3})
prompt
model
parser
パイプ演算子 | を「流れ作業」として理解する

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を構築する。

  • prompt.invoke() の出力 → model.invoke() の入力
  • model.invoke() の出力 → StrOutputParser().invoke() の入力
  • 最終的に文字列(str)が返る
参考リンク
LangChain Docs OpenAI API Reference OpenAI Tokenizer(トークン数の確認) ChatGPT(ブラウザで試せるLLM) Python dotenv ドキュメント