はじめに
前回までにポケモン図鑑の情報を作成しました。今回はいよいよクライマックスで、ポケモン図鑑の情報をEmbedding化しVectorDBのChromaに登録し検索できるようにします
Chromaへの登録
pokemon_30.csv
id,name_jp,name_en,type1,type2,description
1,フシギダネ,Bulbasaur,くさ,どく,背中のタネには養分が詰まっており成長すると芽を出すポケモン。
2,フシギソウ,Ivysaur,くさ,どく,背中のつぼみが大きくなり重くて後ろ足で立つことが多い。
3,フシギバナ,Venusaur,くさ,どく,大きな花から強い香りを放ち戦うときは太陽光を集める。
4,ヒトカゲ,Charmander,ほのお,,尻尾の炎は体調のバロメータで元気なほど大きく燃える。
5,リザード,Charmeleon,ほのお,,気性が荒く炎のしっぽを振り回して威嚇する。
6,リザードン,Charizard,ほのお,ひこう,高温の炎を吐き空を飛び回る強力なポケモン。
7,ゼニガメ,Squirtle,みず,,甲羅に隠れて敵から身を守り水を噴射して攻撃する。
8,カメール,Wartortle,みず,,尻尾のふさふさは寿命が長い証で俊敏に動く。
9,カメックス,Blastoise,みず,,背中の大砲から高圧の水を撃ち出す。
10,キャタピー,Caterpie,むし,,においを放って敵の注意をそらす幼虫ポケモン。
11,トランセル,Metapod,むし,,硬い殻にこもって羽化の準備をしている。
12,バタフリー,Butterfree,むし,ひこう,羽のりん粉で敵を弱らせ花の蜜を好む。
13,ビードル,Weedle,むし,どく,鋭い毒針を持ち危険を感じるとすぐ攻撃する。
14,コクーン,Kakuna,むし,どく,動けないが体の中では急速に成長している。
15,スピアー,Beedrill,むし,どく,腕と尻尾の毒針を使い素早く攻撃する。
16,ポッポ,Pidgey,ノーマル,ひこう,穏やかだが敵に対しては砂を巻き上げて反撃する。
17,ピジョン,Pidgeotto,ノーマル,ひこう,鋭い爪で獲物を捕まえ縄張り意識が強い。
18,ピジョット,Pidgeot,ノーマル,ひこう,高速で空を飛び優雅な翼で風を操る。
19,コラッタ,Rattata,ノーマル,,前歯が鋭く繁殖力が高いポケモン。
20,ラッタ,Raticate,ノーマル,,強力な歯で固いものをかじり切る。
21,オニスズメ,Spearow,ノーマル,ひこう,短気で騒がしく小石でも投げてくる。
22,オニドリル,Fearow,ノーマル,ひこう,太いくちばしで穴を掘り長時間飛び続けられる。
23,アーボ,Ekans,どく,,長い体で獲物を締め上げ毒で仕留める。
24,アーボック,Arbok,どく,,胴の模様で敵を威嚇し強靭な体で締め付ける。
25,ピカチュウ,Pikachu,でんき,,ほっぺたの電気袋に電気をため仲間同士でしっぽを合わせて合図する。
26,ライチュウ,Raichu,でんき,,高電圧を放ちしっぽを地面に刺して放電する。
27,サンド,Sandshrew,じめん,,丸くなって身を守る砂漠で暮らすポケモン。
28,サンドパン,Sandslash,じめん,,鋭いツメで敵を切り裂き素早く穴を掘る。
29,ニドラン♀,Nidoran♀,どく,,小柄だが毒針で身を守る。
30,ニドリーナ,Nidorina,どく,,仲間思いで争いを嫌うが危険時は鋭い毒を使う。
pokemon_chroma_store.py
# pokemon_chroma_store.py
import csv
import os
from dotenv import load_dotenv
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
# 1. .env の読み込み
load_dotenv()
api_key = os.getenv("OPENROUTER_API_KEY")
if not api_key:
raise RuntimeError("OPENROUTER_API_KEY が設定されていません")
# 2. Embedding モデル(OpenAI:text-embedding-3-small)
emb = OpenAIEmbeddings(
model="text-embedding-3-small",
openai_api_key=api_key,
base_url="https://openrouter.ai/api/v1",
)
# 3. CSV の読み込み
csv_path = "pokemon_30.csv"
texts = []
with open(csv_path, encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
# RAG に使いやすいよう1行にまとめる
content = f"{row['name_jp']}({row['name_en']}): タイプ={row['type1']} {row['type2']}。説明: {row['description']}"
texts.append(content)
print(f"CSV 読み込み完了:{len(texts)} 件")
# 4. Chroma に登録(永続化)
PERSIST_DIR = "chroma_pokemon_30"
db = Chroma.from_texts(
texts=texts,
embedding=emb,
collection_name="pokemon_30",
persist_directory=PERSIST_DIR,
)
print("🔥 Chroma にポケモンデータ 30件を保存しました!")
実行結果
(venv) ~/develop/langchain_study (main)$ python3 pokemon_store.py
CSV 読み込み完了:30 件
🔥 Chroma にポケモンデータ 30件を保存しました!
pokemon_search.py
# pokemon_search.py
import os
from dotenv import load_dotenv
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
# 1. .env 読み込み
load_dotenv()
api_key = os.getenv("OPENROUTER_API_KEY")
# 2. Embedding モデル
emb = OpenAIEmbeddings(
model="text-embedding-3-small",
openai_api_key=api_key,
base_url="https://openrouter.ai/api/v1",
)
# 3. 永続化された DB を読み込む
PERSIST_DIR = "chroma_pokemon_30"
db = Chroma(
persist_directory=PERSIST_DIR,
collection_name="pokemon_30",
embedding_function=emb,
)
print("📁 Chroma データベース読み込み完了")
# 4. 質問を受け付ける
while True:
q = input("\n質問 > ").strip()
if not q:
print("終了します。")
break
# 意味検索(k=3)
docs = db.similarity_search(q, k=3)
print("\n🔎 類似ポケモン Top3:")
for i, doc in enumerate(docs, start=1):
print(f"{i}. {doc.page_content}")
実行結果
(venv) ~/develop/langchain_study (main)$ python3 pokemon_query.py
/Users/kouji/develop/langchain_study/pokemon_query.py:22: LangChainDeprecationWarning: The class `Chroma` was deprecated in LangChain 0.2.9 and will be removed in 1.0. An updated version of the class exists in the `langchain-chroma package and should be used instead. To use it run `pip install -U `langchain-chroma` and import as `from `langchain_chroma import Chroma``.
db = Chroma(
📁 Chroma データベース読み込み完了
質問 > 電気を貯めるポケモンは?
🔎 類似ポケモン Top3:
1. ピカチュウ(Pikachu): タイプ=でんき 。説明: ほっぺたの電気袋に電気をため仲間同士でしっぽを合わせて合図する。
2. ライチュウ(Raichu): タイプ=でんき 。説明: 高電圧を放ちしっぽを地面に刺して放電する。
3. リザードン(Charizard): タイプ=ほのお ひこう。説明: 高温の炎を吐き空を飛び回る強力なポケモン。
質問 > トカゲは?
🔎 類似ポケモン Top3:
1. ヒトカゲ(Charmander): タイプ=ほのお 。説明: 尻尾の炎は体調のバロメータで元気なほど大きく燃える。
2. キャタピー(Caterpie): タイプ=むし 。説明: においを放って敵の注意をそらす幼虫ポケモン。
3. ラッタ(Raticate): タイプ=ノーマル 。説明: 強力な歯で固いものをかじり切る。
質問 >
最後に
いいですね!!簡単に実装できるので、こんな簡単にRAGが作れると夢が広がりますね!!!
余談
ちなみに、今回もほとんどコストはかかっていません。
