概要
ChatGPTのAPIが公開されて、役立つライブラリを調べているとLlamaIndexに出会った😊
LlamaIndexを初めて触ったので、同じ初心者向けに備忘録を残す!
以下に出てくるコードでは変更点についても追記しているのでご利用中のバージョンに合わせてコードを参考にしてください。
LlamaIndexとは
初心者目線で一言で説明するとこんな感じ
モデルを学習させる(ファインチューニング)ではなく、プロンプトに学習データを詰め込むイメージ!
LlamaIndexを使うと「全部の独自データ」をプロンプトに含めず、いい感じに「一部の独自データだけ」プロンプトに含めてくれる😊
必要なもの
- Pythonが実行できる環境
- Opne AIのAPIキー
以下のページで取得しておく。
インストール方法
pipコマンドでインストールできる。
pip install llama-index
LlamaIndexの基本
LlamaIndexを使う上で最初に知っておくべき基本知識を解説する。
早く動かしたい人は飛ばしてもOK!
学習データ
- 学習データは普通の文章でOK。
- 「.txt」「.pdf」「.docx」などが指定できる。
- ローカルのファイル以外にもWeb上のURLも学習データに使える。
インデックス
- 質問するには「インデックス」と呼ばれるものが必須。
(インデックスを使って質問すると、学習データを含めた回答をしてくれる仕組み!)
- 「インデックス」は学習データから簡単に作れる。
プログラムの流れ
以下の流れでLlamaIndexを使用する✅
- (事前に)学習データを用意する。
- インデックスを生成する。
- インデックスを使って質問する。
とりあえず動かしてみる(公式のサンプルデータ)
公式でサンプルデータが用意されているので、公式からデータを取ってきて動かす方法を解説する。
実行に必要なもの
- 学習データ(テキスト、PDFなど)
→サンプルに入っている
- 実行するプログラム(.py)
→自分で作る
【手順1】学習データを用意(サンプルの取得)
GitHubで公開されているのでクローンすればOK✅
$ git clone https://github.com/jerryjliu/gpt_index.git
【手順2】サンプルプログラムを実行してみる
大量のサンプルが入っているが、今回はexamples/paul_graham_essay/data/paul_graham_essay.txt
の学習データを使ってみる。
サンプルプログラムの作成
以下の場所に「Test.py」を新規作成する。
examples/paul_graham_essay/Test.py
# Open AIのAPIキーを設定
import os
os.environ["OPENAI_API_KEY"] = 'YOUR_OPENAI_API_KEY'
# LlamaIndexのインポート
from llama_index import GPTSimpleVectorIndex, SimpleDirectoryReader
# ---------------------------------------------------------
# 手順1(インデックスを用意)
# ---------------------------------------------------------
# dataフォルダ内の学習データを使い、インデックスを生成する
documents = SimpleDirectoryReader('data').load_data()
index = GPTSimpleVectorIndex.from_documents(documents)
# ---------------------------------------------------------
# 手順2(インデックスを使って質問)
# ---------------------------------------------------------
# 質問を実行
response = index.query("What did the author do growing up?")
print(response)
【注意】Ver.0.6.0以降の場合
上記のままだとエラーになる。
以下のとおり書き換えて実行する。(赤文字が変更箇所)
# Open AIのAPIキーを設定
import os
os.environ["OPENAI_API_KEY"] = 'YOUR_OPENAI_API_KEY'
# LlamaIndexのインポート
from llama_index import GPTVectorStoreIndex, SimpleDirectoryReader
# ---------------------------------------------------------
# 手順1(インデックスを用意)
# ---------------------------------------------------------
# dataフォルダ内の学習データを使い、インデックスを生成する
documents = SimpleDirectoryReader('data').load_data()
index = GPTVectorStoreIndex.from_documents(documents)
# ---------------------------------------------------------
# 手順2(インデックスを使って質問)
# ---------------------------------------------------------
# 質問を実行
query_engine = index.as_query_engine()
response = query_engine.query("What did the author do growing up?")
print(response)
サンプルプログラムの実行
✅ターミナルやコマンドプロンプトを起動し、サンプルプログラムの場所に移動する。
cd paul_graham_essayフォルダのパス
※これをしないとサンプルプログラム内の相対パスが機能しないので注意。
✅サンプルプログラムを実行する。
python Test.py
✅実行結果
INFO:llama_index.token_counter.token_counter:> [build_index_from_nodes] Total LLM token usage: 0 tokens
INFO:llama_index.token_counter.token_counter:> [build_index_from_nodes] Total embedding token usage: 17617 tokens
INFO:llama_index.token_counter.token_counter:> [query] Total LLM token usage: 4064 tokens
INFO:llama_index.token_counter.token_counter:> [query] Total embedding token usage: 8 tokens
The author grew up writing short stories, programming on an IBM 1401, and working on microcomputers. He wrote simple games, a program to predict how high his model rockets would fly, and a word processor. He studied philosophy in college, but switched to AI. He reverse-engineered SHRDLU for his undergraduate thesis and wrote a book about Lisp hacking. He visited the Carnegie Institute and realized he could make art that would last. He took art classes at Harvard and applied to RISD and the Accademia di Belli Arti in Florence, where he arrived at an arrangement whereby the students wouldn't require the faculty to teach anything, and in return the faculty wouldn't require the students to learn anything. He also had the opportunity to paint still lives in his bedroom at night, using leftover scraps of canvas.
とりあえず動かしてみる(独自データ)
やり方は公式のサンプルを使うときと同じ。
今度は学習データを自分で用意してみる。
実行に必要なもの
- 学習データ(テキスト、PDFなど)
→自分で用意する
- 実行するプログラム(.py)
→自分で作る
【手順1】学習データを用意
任意の場所に学習データを用意する!
学習データの書式
- ファイル形式は「.txt」「.pdf」「.docx」など
- 日本語の場合は、各行の先頭にスペースが必要
- 文字コードはshift_jis
【補足】Markdownは未対応?
マークダウンファイル「.md」を学習させようとしたらエラーになった。
→何かしらのツールを使って事前に「PDF」に変換して、「PDF」を学習させればOK!
例
名探偵コナンの映画「黒鉄の魚影」についてのデータを用意した。
LlamaIndex_Test/data_Conan/document_Conan.md
# 名探偵コナン 黒鉄の魚影
## 概要
第25作『ハロウィンの花嫁』が2022年4月に上映された際に流された、劇場版シリーズ定番となっている本編終了後の次回作予告では、黒の組織の登場とシェリー(灰原哀)がキーパーソンとなることが示唆されていた。2022年11月7日、劇場版『名探偵コナン』第26作の公開が、YouTubeの東宝MOVIEチャンネルで解禁された「劇場版『名探偵コナン2023』超特報【2023年GW公開】」と題した特報によって発表された。この特報映像は、第25作『ハロウィンの花嫁』のハロウィン再会(リバイバル)上映での本編終了後に突如流された特報映像である。映像は、かつて黒の組織の一員(シェリー)であった灰原哀にフィーチャーされ、再会上映の初日からSNSで大きな話題となった30秒の映像である。また、2023年GW公開であることとともに、映像の最後でタイトルロゴが表示され、サブタイトルの1文字目が"黒"であることも明かされた。2022年11月30日に、『週刊少年サンデー』2023年1号にて、2023年4月14日公開であることが発表された。タイトル、ビジュアルも解禁され、監督は立川譲、脚本は櫻井武晴、音楽は菅野祐悟が担当することが公表された。黒の組織が劇場版に関わるのは、第20作『純黒の悪夢』以来6作ぶりとなる。また、黒の組織のナンバー2にあたるラムや、赤井秀一、安室透(バーボン)の登場も示唆されており、安室は前作に引き続き登場となる。ラムの素顔がアニメに登場するのは、TV版に先行して劇場版である本作のPVが初である。
## ストーリー
ドイツのフランクフルトでキール(水無怜奈)は、ユーロポールの女性職員ニーナを追跡していた。ニーナは逃げながら、友人であるFBI捜査官のジョディ・スターリングに電話で助けを求める。キールはニーナを追い詰めつつも密かに彼女を逃がそうとするが、ジンが背後からキールの肩ごとニーナを撃ち抜いて殺害してしまう。また、都内ではベルモットがバーボン(安室透)に対し、計画が順調であることと、残すは例のシステムで"ある人物"を探すだけだと語る。コナンは、少年探偵団と一緒に、八丈島のホエールウォッチングツアーが当たるという福引に来ていた。灰原哀は、その近くで行われていたフサエブランドの限定ブローチの整理券を運よく入手するが、後から来て整理券を受け取れなかった高齢女性にその整理券を譲った。探偵団たちはみんな福引で外れてしまったが、灰原が高齢女性に整理券を譲るのを見ていた園子は、そのご褒美として探偵団達をホエールウォッチングに招待する。八丈島のホテルに向かう車の中で、コナンは八丈島近海にインターポールの海洋施設「パシフィック・ブイ」が建設されたというニュースを聞く。それは世界中の警察が持つ防犯カメラを監視できる世界初の施設であり、責任者の牧野洋輔とシステム開発者の直美・アルジェントが説明していた。その後、ホテルに到着すると沖矢昴(赤井秀一)から電話があり、ユーロポールのネットワークセンターに黒の組織のメンバーが侵入し、パシフィック・ブイのシステムにハッキングしたという話を聞く。侵入したのはピンガというコードネームのコーンロウの髪が特徴の男で、組織の最高幹部ラムの側近だという。さらに、侵入したピンガを目撃した女性職員がジンに殺害されたことと、パシフィック・ブイがユーロポールのネットワークセンターの回線と接続して本格稼働しようとしていることを知る。その後、コナンらはホエールウォッチングのために港を訪れるが、コナンは近くで警視庁捜査一課管理官の黒田兵衛と白鳥警部が乗った船が出発しようとしているのに気づき、こっそり密航する。船はパシフィック・ブイに到着し、黒田に見つかったコナンは仕方なく同行を許され、黒田らとメインルームでシステムを運営するエンジニア達を紹介される。パシフィック・ブイのシステムについても説明があり、海中にある膨大なサーバーをもとに、直美が開発した「老若認証」とAIの顔認証による解析で、防犯カメラの情報を元にあらゆる場所で犯罪者を追跡できるというものだった。牧野は、コナンや黒田たちが見ている前でシステムをユーロポールのネットワークに接続。稼働したシステムの画面には、ヨーロッパ中の防犯カメラの映像が映し出される。その頃、既に施設内に潜入しているピンガの手引きで、海中からベルモットとバーボンがパシフィック・ブイに潜入。休憩に出た直美を拉致し、脱出ポッドで施設外に連れ去った。休憩が終わっても直美が戻らないことを不審に思った牧野達は、監視カメラを解析して直美の動向を調べ、2人組の清掃員らしき人物たちに拉致されたことに気付く。脱出ポッドを開閉できる権限を持つのは牧野とメインルームのエンジニア達だけだったため、コナンはその中に拉致の犯人達の共犯者がいるかもしれないと考える。直美を拉致したベルモットとバーボンは、ウォッカとキールと合流。組織のボスの命令で、パシフィック・ブイのシステムを通して防犯カメラに映る組織のメンバーの姿や犯罪の様子を隠滅するため、直美を拉致したのだった。ベルモットは、直美が身につけていたネックレスが小型のUSBメモリになっているのに気づき、中身を調べる。中にはかつて組織のメンバーだったシェリーの写真と灰原の写真を並べたファイルが入っており、老若認証の結果が「一致」と表示されていた。これを見たベルモットたちは、ベルツリー急行の爆破で死んだはずのシェリーが、子供の姿になって生き延びていた可能性を考える。ウォッカがこのことをジンに知らせると、ジンは「そっちに合流してから直接確かめる」と言い、システムを利用して灰原を見つけ拉致するよう指示する。コナンは八丈島のホテルに戻ると、阿笠博士に組織が拉致事件に関わっていることを伝えるが、灰原がそれを盗み聞きしていた。コナンは灰原に、明日少年探偵団らと帰るように伝え、念のためお守りとして自分が持っていた追跡メガネの1号機を渡し、代わりに灰原が持っていた予備の追跡メガネを受け取る。しかしその夜、組織の気配を感じた灰原は一人で部屋を出ようとするが、待ち受けていたウォッカとピンガに連れ去られてしまう。それに気づいたコナンと蘭が奮闘し、蘭はピンガの首に蹴りを食らわせる。その後、コナンは阿笠博士と共に、灰原を乗せたウォッカ達の車を追跡する。しかし、ウォッカ達の車は崖から海へ飛び込んでしまい、コナンも海に飛び込み必死に追いかける。その直後、コナンは海中から組織の巨大な潜水艦が浮上するのを目撃する。灰原の拉致を防げなかったコナンは、博士と共に悔しさを滲ませ、「ぜってぇ助けに行く」と胸に誓う。その後、パシフィック・ブイでエンジニアの一人が死亡する事件が発生する。防犯カメラの映像を見る限りでは服毒自殺にしか見えないが、コナンはエンジニアの死は他殺だと考える。さらに、防犯カメラの映像で昨夜の阿笠博士の車とウォッカ達の車のカーチェイスの映像を探すと、どのカメラにもウォッカ達の車が映っておらず、防犯カメラの映像が改ざんされている可能性が浮上。ユーロポールのネットワークセンターに侵入した男が、そこからパシフィック・ブイのシステムにハッキングしてバックドアを仕込み、そのバックドアを通してパシフィック・ブイの防犯カメラ映像を改ざんしたのではないかと考えられた。その頃、潜水艦内には灰原と直美が捕えられており、その潜水艦にヘリからジンが合流しようとしていた。
## 登場人物
### メインキャラクター
#### 江戸川コナンと周辺の人物
##### 江戸川 コナン(えどがわ コナン)
声 - 高山みなみ
本作の主人公。本来の姿は「東の高校生探偵」として名を馳せている「工藤新一」だが、黒の組織に飲まされた毒薬・APTX4869の副作用で小学生の姿になっている。
##### 灰原 哀(はいばら あい)
声 - 林原めぐみ
本作のヒロインでキーパーソン。元黒の組織の一員で、在籍当時のコードネームは「シェリー(Sherry)」。APTX4869の開発者で、コナンの正体を新一と知る数少ない人物の1人。本来の姿は「宮野 志保(みやの しほ)」だが、組織を離脱する際に自殺目的でAPTX4869を自ら飲み、コナン同様小学生の姿になっている。本作では、直美が持っていたUSBメモリのデータから、ウォッカ達にシェリーが子供の姿になって生き延びていたと思われ、拉致されてしまう。
##### 毛利 蘭(もうり らん)
声 - 山崎和佳奈
本編のヒロイン。新一の幼馴染かつ彼女。関東大会で優勝するほどの空手の達人。
##### 毛利 小五郎(もうり こごろう)
声 - 小山力也
蘭の父親で、「眠りの小五郎」の異名で有名な私立探偵。コナンの保護者。
##### 工藤 新一 (くどう しんいち)
声 - 山口勝平
コナンの正体で、「東の高校生探偵」として名を馳せている高校生。
##### 阿笠 博士(あがさ ひろし)
声 - 緒方賢一
コナンの正体を新一と知る数少ない人物の1人で、発明家。灰原の保護者。本作では、灰原を連れ去ったウォッカとピンガの車をビートルで追い、熾烈なカーチェイスを繰り広げる。
##### 赤井 秀一(あかい しゅういち)
声 - 池田秀一
連邦捜査局 (FBI) の捜査官。かつて「諸星 大(もろぼし だい)」と名乗って「ライ(Rye)」のコードネームで黒の組織に潜入していた。現在は組織に対して自らの死を偽装し、変装して「沖矢昴」と名乗っている。コナン本人には告げていないが、コナンの正体を新一と知る数少ない人物の1人でもある。
##### 沖矢 昴(おきや すばる)
声 - 置鮎龍太郎
赤井の変装した姿。東都大学大学院工学部博士課程の大学院生と称している。
##### 安室 透(あむろ とおる)/ バーボン(Bourbon)
声 - 古谷徹
警察庁警備局警備企画課(ゼロ)の公安警察捜査官。本名は降谷 零(ふるや れい)。「バーボン」のコードネームで組織に潜入している。普段は探偵の安室 透(あむろ とおる)として、毛利探偵事務所の下の「喫茶ポアロ」でアルバイトをしている。本作では、主にバーボンとして組織のメンバー達と行動を共にするが、その裏で公安を動かしたりコナンに情報を伝えたりする。
##### 水無 怜奈(みずなし れな) / キール(kir)
声 - 三石琴乃
アメリカ中央情報局 (CIA) の諜報員。本名は本堂 瑛海(ほんどう ひでみ)。「キール」のコードネームで組織に潜入している。本作では、組織の任務に従う振りをしながら、灰原と直美が脱出できるよう密かに手引きを行う。
##### 黒田 兵衛(くろだ ひょうえ)
声 - 岸野幸正
警視庁刑事部捜査一課の管理官で、階級は警視。目暮警部や佐藤刑事たちの上司。本作では、八丈島近海に新たに完成する海洋施設の警備に白鳥と共に参加する。
##### 白鳥 任三郎(しらとり にんざぶろう)
声 - 井上和彦
警視庁捜査一課の刑事で、階級は警部。コナンたちの担任教師の小林 澄子(こばやし すみこ)と交際中。
##### 目暮 十三(めぐれ じゅうぞう)
声 - 茶風林
警視庁刑事部捜査一課強行犯捜査三係の警部。
##### 佐藤 美和子(さとう みわこ)
声 - 湯屋敦子
警視庁捜査一課の刑事で、階級は警部補。格闘技に長けていて洞察力も鋭く、射撃の腕も一流。同じ捜査一課の高木 渉(たかぎ わたる)刑事と交際中。
##### 風見 裕也(かざみ ゆうや)
声 - 飛田展男
警視庁公安部所属の公安警察捜査官で、階級は警部補。
##### ジェイムズ・ブラック (James Black)、ジョディ・スターリング (Jodie Starling)、アンドレ・キャメル (Andre Camel)
声 - 土師孝也(ジェイムズ)、一城みゆ希(ジョディ)、乃村健次(キャメル)
日本で黒の組織の捜査を行っているFBI捜査官達で、コナンの協力者。日本警察には内密で黒の組織の捜査を進めている。本作では、ユーロポールでの事件を受け、ドイツに赴く。
##### イーサン・本堂(イーサン・ほんどう)
声 - 小山力也
CIAの諜報員で、本堂瑛海の父。故人。組織に殺されそうになった娘の瑛海を守る為、自ら犠牲になった。
##### 宮野明美(みやの あけみ)
声 - 玉川砂記子
灰原哀こと宮野志保の姉。故人。黒の組織10億円強盗事件の一件で、ジンに殺害される。組織に潜入していた頃の赤井秀一と恋仲だった。
##### 鈴木 園子(すずき そのこ)
声 - 松井菜桜子
蘭の同級生で親友。鈴木財閥の令嬢で、蘭や新一とは幼馴染でもある。本作では、灰原が老婆に親切な一面を目撃した事で八丈島のホエールウォッチングにコナンたちを招待する。
##### 吉田 歩美(よしだ あゆみ)、小嶋 元太(こじま げんた)、円谷 光彦(つぶらや みつひこ)
声 - 岩居由希子(歩美)、高木渉(元太)、大谷育江(光彦)
少年探偵団の3人。本作では、園子の招待を受けて八丈島へホエールウォッチングにやって来る。
#### 黒の組織
コナンやFBIが追っている、世界規模の犯罪組織。本作では2016年公開の劇場版第20作『純黒の悪夢』以来の登場、2001年公開の劇場版第5作『天国へのカウントダウン』、2009年公開の劇場版第13作『漆黒の追跡者』と合わせて第4作目の登場になる。
##### あの方
回想とメールの返信にのみ登場。黒の組織のボス。身元は半世紀前に99歳で死去したとされている大富豪で烏丸家の当主・烏丸 蓮耶(からすま れんや)。今の正体と行方は不明で、ラムも行方を知らずしばらく会っていないことが語られている。組織のメンバーは「あの方」と呼び、ベルモットだけが「ボス」と呼ぶ。メールアドレスは「♯969♯6261」、携帯電話のボタン音は童謡「七つの子」のメロディに似ている。
##### ラム (Rum)
声 - 千葉繁
ボスの側近にして、組織のNo.2の地位にある最高幹部。コードネームを持つメンバーの中でも別格の存在で、ジン以上の切れ者。左目が義眼。変装して脇田 兼則(わきた かねのり)と名乗り、毛利探偵事務所の隣の寿司屋「米花いろは寿司」で板前をしながら潜伏している。コナンはまだ、脇田の正体がラムであることを知らない。本作ではラムとしての登場のみで、脇田兼則としては登場していない。電話でメンバーとの通話する際には、携帯に内蔵されているボイスチェンジャーで声を変えている。
##### ジン (Gin)
声 - 堀之紀
組織の実行部隊のリーダーで、新一にAPTX4869を飲ませて幼児化させた張本人。銀色の長髪と氷のように冷たい目が特徴の、長身痩躯の男。洞察力や射撃の能力に優れており、「疑わしきは罰せよ」を信条としている。コナンが新一であることを知らない。
##### ベルモット (Vermouth)
声 - 小山茉美
組織の女性幹部。正体はかつてハリウッドでアカデミー賞を受賞した大女優「シャロン・ヴィンヤード」で、「千の顔を持つ魔女」と称される変装の達人。組織で唯一コナンの正体を新一と知る人物。組織を裏切ったシェリー(灰原哀)に執着しており、抹殺を企んでいる(シェリーが幼児化していることも組織で唯一知っている)。
##### ウォッカ (Vodka)
声 - 立木文彦
組織の幹部で、ジンの腹心。
##### キャンティ (Chianti)
声- 井上喜久子
組織に所属する気性の荒い女性スナイパー。
##### コルン (Korn)
声 - 木下浩之
組織に所属する無口で冷静なスナイパー。
##### ピスコ (Pisco)
序盤の回想でのみ登場。ボスに長年仕えていた組織の幹部。表の顔は自動車メーカーの会長で、本名は「枡山憲三(ますやまけんぞう)」。杯戸シティホテルでの任務で標的を暗殺したが、犯行の瞬間をカメラマンに撮影されるという失態を犯してしまった事で、ジンによって射殺された。
##### テキーラ (Tequila)
序盤の回想でのみ登場。ウォッカと同じ幹部の腹心クラスの地位を持つメンバー。関西弁を話す大男で、主にコンピュータプログラム関係の取引を担当していた。ゲーム制作会社で有能なプログラマーのリストを高額で買い取る取引を行おうとしたが、組織とは無関係の犯人が取引相手を狙って仕掛けた爆弾入りのカバンを開けてしまい、爆死した。
##### アイリッシュ (Irish)
序盤の回想でのみ登場。劇場版「漆黒の追跡者」で登場したメンバー。ジンと同格の幹部クラスであり、優れた頭脳と戦闘能力を併せ持つ。組織のNOCリスト入りメモリーカードの回収任務を負い、ベルモットの助力で変装して警視庁に潜入。メモリカードの回収には成功するが、変装が警察にバレて逃げ場を失ったため、ジンの指示でキャンティに撃たれる。更にコナン(新一)を庇う際に再度の狙撃による致命傷を負い、死亡。
##### キュラソー (Cura?ao)
前半の回想でのみ登場。劇場版「純黒の悪夢」で登場したメンバー。ラムの元腹心。オッドアイの目が特徴で、高い身体能力と戦闘能力に加え、5色のカードを使った優れた記憶能力持つ情報収集のスペシャリスト。警察庁に保管されている世界のNOCリストの強奪任務に当たったが、逃走中の交通事故によって記憶喪失となり、子供たちとの交流による心変わりで組織を裏切る。最後は、観覧車に閉じ込められた子供達を救うため重機による特攻で止め、観覧車に潰されると同時に爆死。彼女の死後、後述のピンガが側近として居座る事になる。
### オリジナルキャラクター
#### 組織のメンバー
##### ピンガ (Pinga)〈25〉
ラムの側近。ラムから気に入られており、当時腹心であったキュラソーの死後に側近の座に納まった。コーンロウに編み上げられた金色の髪型で、太い唇が特徴の男性。他人を蹴落としてものし上がろうとする貪欲な性格であり、その次なる標的にして、組織の幹部であるジンに強い対抗心を燃やしている。また、ラム以外のメンバーの指示を一切聞かない。細身な体格だが、蘭と渡り合えるほどの格闘技術を持つほか、高度なAI技術を使いこなすエンジニアとしての能力にも長けている。
#### 海洋施設「パシフィック・ブイ」
##### 牧野 洋輔 (まきの ようすけ)
声 - 沢村一樹
「パシフィック・ブイ」の局長。世界各国から集まったエンジニア達を束ねるリーダー。
##### 直美・アルジェント (なおみ・アルジェント)〈19〉
声 - 種﨑敦美
「パシフィック・ブイ」のエンジニアで、老若認証システムの開発者。「人種差別の無い世界を作りたい」との考えから老若認証システムを開発した。アメリカ育ちで、イタリア人の父親と日本人の母親を持つハーフ。父親はEU議会議員のマリオ・アルジェント。灰原の本来の姿である志保とは小学生の頃に知り合っており、今でも彼女との再会を待ち望んでいる。
##### レオンハルト
声 - 諏訪部順一
「パシフィック・ブイ」のエンジニア。ドイツ出身。様々な組織を渡り歩いてきたらしいが、そこで嫌な思いをしたため、日本人を露骨に嫌うなど人種差別的な考えを持つ。
##### エド
声 - 神谷浩史
「パシフィック・ブイ」のエンジニア。インド出身。マイペースな性格だが、エンジニアとしての腕はかなりのもの。
##### グレース
声 - 村瀬歩
「パシフィック・ブイ」のエンジニア。フランス出身。気さくで明るい性格。
#### ユーロポールの捜査官
##### ハンス
声 - 土田大
ユーロポールの捜査官で、ドイツ・フランクフルトにあるネットワークセンターの管理者。
##### ニーナ
声 - 宮原永海
ユーロポールの捜査官で、FBIのジョディの友人。ある一件から組織に命を狙われる。
#### 八丈島
##### 丑尾 寛治 (うしお かんじ)
声 - 沢木郁也
八丈島の観光船船長。阿笠博士の発明品を見て感心し、意気投合する。
- データ構造を表したかったので、txtではなくmdで作成した✅
- しかしmdファイルはそのまま読み込めないのでPDFに変換する必要がある💦
↓PDFに変換したもの。「LlamaIndex_Test/data_Conan/」に以下のファイルを保存しておく。
【手順2】サンプルプログラムを実行してみる
公式のサンプルのときと同じ方法で実行できる✅
サンプルプログラムの作成
以下の場所に「Test.py」を新規作成する。
LlamaIndex_Test/Test.py
# Open AIのAPIキーを設定
import os
os.environ["OPENAI_API_KEY"] = 'YOUR_OPENAI_API_KEY'
# LlamaIndexのインポート
from llama_index import GPTSimpleVectorIndex, SimpleDirectoryReader
# ---------------------------------------------------------
# 手順1(インデックスを用意)
# ---------------------------------------------------------
# data_conanフォルダ内の学習データを使い、インデックスを生成する
documents = SimpleDirectoryReader('data_Conan').load_data()
index = GPTSimpleVectorIndex.from_documents(documents)
# ---------------------------------------------------------
# 手順2(インデックスを使って質問)
# ---------------------------------------------------------
# 質問を実行
response = index.query("「名探偵コナン 黒鉄の魚影」のピンガについて教えて")
print(response)
【注意】Ver.0.6.0以降の場合
上記のままだとエラーになる。
以下のとおり書き換えて実行する。(赤文字が変更箇所)
# Open AIのAPIキーを設定
import os
os.environ["OPENAI_API_KEY"] = 'YOUR_OPENAI_API_KEY'
# LlamaIndexのインポート
from llama_index import GPTVectorStoreIndex, SimpleDirectoryReader
# ---------------------------------------------------------
# 手順1(インデックスを用意)
# ---------------------------------------------------------
# data_conanフォルダ内の学習データを使い、インデックスを生成する
documents = SimpleDirectoryReader('data_Conan').load_data()
index = GPTVectorStoreIndex.from_documents(documents)
# ---------------------------------------------------------
# 手順2(インデックスを使って質問)
# ---------------------------------------------------------
# 質問を実行
query_engine = index.as_query_engine()
response = query_engine.query("「名探偵コナン 黒鉄の魚影」のピンガについて教えて")
print(response)
サンプルプログラムの実行
✅ターミナルやコマンドプロンプトを起動し、サンプルプログラムの場所に移動する。
cd LlamaIndex_Testフォルダのパス
※これをしないとサンプルプログラム内の相対パスが機能しないので注意。
✅サンプルプログラムを実行する。
python Test.py
✅実行結果
ピンガは、名探偵コナンの黒鉄の魚影で登場する悪役です。彼は組織のウォッカと共に、灰原を拉致しようとします。コナンと蘭が灰原を助けようと奮闘しますが、蘭はピンガの頭に蹴りを当てます。しかし、灰原は拉致されてしまいます。
中級編
ここまででも簡単なプログラムは動かせる。
ここからはカスタマイズするために知っておくべき知識の紹介✅
インデックスは保存できる
毎回同じ学習データを使ってインデックスを生成するのは大変🥲
(時間がかかる。API料金がかかる。)
save_to_disk("保存先のパス")
で保存できる。
index.save_to_disk('index_Conan.json')
load_from_disk("保存先のパス")
で保存したインデックスファイルを呼び出す。
index = GPTSimpleVectorIndex.load_from_disk('index_Conan.json')
例
「インデックス生成プログラム」「質問実行プログラム」の2つに分けると便利✅
インデックス生成プログラム
LlamaIndex_Test/Test_make_index.py
# Open AIのAPIキーを設定
import os
os.environ["OPENAI_API_KEY"] = 'YOUR_OPENAI_API_KEY'
# LlamaIndexのインポート
from llama_index import GPTSimpleVectorIndex, SimpleDirectoryReader
# インデックスファイルを生成
documents = SimpleDirectoryReader('data_Conan_pdf').load_data()
index = GPTSimpleVectorIndex.from_documents(documents)
# インデックスファイルを保存
index.save_to_disk('index_Conan.json')
【注意】Ver.0.6.0以降の場合
上記のままだとエラーになる。
以下のとおり書き換えて実行する。(赤文字が変更箇所)
# Open AIのAPIキーを設定
import os
os.environ["OPENAI_API_KEY"] = 'YOUR_OPENAI_API_KEY'
# LlamaIndexのインポート
from llama_index import GPTSimpleVectorIndex, SimpleDirectoryReader
# インデックスファイルを生成
documents = SimpleDirectoryReader('data_Conan_pdf').load_data()
index = GPTSimpleVectorIndex.from_documents(documents)
# インデックスファイルを保存
index.storage_context.persist(persist_dir="./storage")
※引数を省略すると自動で同階層に「storage」フォルダを作成して、その中にデータを保存する。
質問実行プログラム
LlamaIndex_Test/Test.py
# Open AIのAPIキーを設定
import os
os.environ["OPENAI_API_KEY"] = 'YOUR_OPENAI_API_KEY'
# LlamaIndexのインポート
from llama_index import GPTSimpleVectorIndex, SimpleDirectoryReader
# 手順1(インデックスを用意)
# インデックスファイルを読み込む
index = GPTSimpleVectorIndex.load_from_disk('index_Conan.json')
# 手順2(インデックスを使って質問)
# 質問を実行
response = index.query("「名探偵コナン 黒鉄の魚影」のピンガについて教えて")
print(response)
【注意】Ver.0.6.0以降の場合
上記のままだとエラーになる。
以下のとおり書き換えて実行する。(赤文字が変更箇所)
# Open AIのAPIキーを設定
import os
os.environ["OPENAI_API_KEY"] = 'YOUR_OPENAI_API_KEY'
# LlamaIndexのインポート
from llama_index import StorageContext, load_index_from_storage
# 手順1(インデックスを用意)
# インデックスファイルを読み込む
storage_context = StorageContext.from_defaults(persist_dir="./storage")
index = load_index_from_storage(storage_context)
# 手順2(インデックスを使って質問)
# 質問を実行
query_engine = index.as_query_engine()
response = query_engine.query("「名探偵コナン 黒鉄の魚影」のピンガについて教えて")
print(response)
※後で紹介するLLMやプロンプトの設定をしている場合はfrom_defaults(
persist_dir="./storage",
llm_predictor=llm_predictor)
のように指定する必要がある。
学習データは外部データでもOK
前述の例では以下のようにSimpleDirectoryReader
でローカルの学習データからインデックスを生成した。
# Open AIのAPIキーを設定
import os
os.environ["OPENAI_API_KEY"] = 'YOUR_OPENAI_API_KEY'
# LlamaIndexのインポート
from llama_index import GPTSimpleVectorIndex, SimpleDirectoryReader
# 手順1(インデックスファイルを用意)
documents = SimpleDirectoryReader('data').load_data()
index = GPTSimpleVectorIndex.from_documents(documents)
以下で主要な方法を紹介する。
ローカルファイル
ここまでの例で使用していた一番シンプルな方法。
SimpleDirectoryReader
を使うと、ローカルの「.txt」「.pdf」「.docs」などからインデックスを生成できる✅
# Open AIのAPIキーを設定
import os
os.environ["OPENAI_API_KEY"] = 'YOUR_OPENAI_API_KEY'
# LlamaIndexのインポート
from llama_index import GPTSimpleVectorIndex, SimpleDirectoryReader
# インデックスファイルを生成
documents = SimpleDirectoryReader('data').load_data()
index = GPTSimpleVectorIndex.from_documents(documents)
【注意】Ver.0.6.0以降の場合
上記のままだとエラーになる。
以下のとおり書き換えて実行する。(赤文字が変更箇所)
# Open AIのAPIキーを設定
import os
os.environ["OPENAI_API_KEY"] = 'YOUR_OPENAI_API_KEY'
# LlamaIndexのインポート
from llama_index import GPTVectorStoreIndex, SimpleDirectoryReader
# インデックスファイルを生成
documents = SimpleDirectoryReader('data').load_data()
index = GPTVectorStoreIndex.from_documents(documents)
【詳細な解説】
Webサイト(シンプル)
SimpleWebPageReader
を使うと、Webサイトからインデックスを生成できる✅
# Open AIのAPIキーを設定
import os
os.environ["OPENAI_API_KEY"] = 'YOUR_OPENAI_API_KEY'
# LlamaIndexのインポート
from llama_index import GPTSimpleVectorIndex, download_loader
# SimpleWebPageReaderを準備
SimpleWebPageReader = download_loader("SimpleWebPageReader")
# インデックスファイルを生成
loader = SimpleWebPageReader()
documents = loader.load_data(urls=['https://google.com'])
index = GPTSimpleVectorIndex.from_documents(documents)
【注意】Ver.0.6.0以降の場合
上記のままだとエラーになる。
以下のとおり書き換えて実行する。(赤文字が変更箇所)
# Open AIのAPIキーを設定
import os
os.environ["OPENAI_API_KEY"] = 'YOUR_OPENAI_API_KEY'
# LlamaIndexのインポート
from llama_index import GPTVectorStoreIndex, download_loader
# SimpleWebPageReaderを準備
SimpleWebPageReader = download_loader("SimpleWebPageReader")
# インデックスファイルを生成
loader = SimpleWebPageReader()
documents = loader.load_data(urls=['https://google.com'])
index = GPTVectorStoreIndex.from_documents(documents)
Webサイト(BeautifulSoup4)
BeautifulSoupWebReader
を使うと、BeautifulSoup4を使ってWebサイトからインデックスを生成できる✅
# Open AIのAPIキーを設定
import os
os.environ["OPENAI_API_KEY"] = 'YOUR_OPENAI_API_KEY'
# LlamaIndexのインポート
from llama_index import GPTSimpleVectorIndex, download_loader
# BeautifulSoupを準備
BeautifulSoupWebReader = download_loader("BeautifulSoupWebReader")
# インデックスファイルを生成
loader = BeautifulSoupWebReader()
documents = loader.load_data(urls=['https://google.com'])
index = GPTSimpleVectorIndex.from_documents(documents)
【注意】Ver.0.6.0以降の場合
上記のままだとエラーになる。
以下のとおり書き換えて実行する。(赤文字が変更箇所)
# Open AIのAPIキーを設定
import os
os.environ["OPENAI_API_KEY"] = 'YOUR_OPENAI_API_KEY'
# LlamaIndexのインポート
from llama_index import GPTVectorStoreIndex, download_loader
# BeautifulSoupを準備
BeautifulSoupWebReader = download_loader("BeautifulSoupWebReader")
# インデックスファイルを生成
loader = BeautifulSoupWebReader()
documents = loader.load_data(urls=['https://google.com'])
index = GPTVectorStoreIndex.from_documents(documents)
【詳細な解説】
公式ドキュメント
使用例の参考
【補足】BeautifulSoupについて
Webサイト(Wikipedia専用)
WikipediaReader
を使うと、Wikipediaからインデックスを生成できる✅
# Open AIのAPIキーを設定
import os
os.environ["OPENAI_API_KEY"] = 'YOUR_OPENAI_API_KEY'
# LlamaIndexのインポート
from llama_index import GPTSimpleVectorIndex, download_loader
# WikipediaReaderを準備
WikipediaReader = download_loader("WikipediaReader")
# インデックスファイルを生成
loader = WikipediaReader()
documents = loader.load_data(pages=['Berlin', 'Rome', 'Tokyo', 'Canberra', 'Santiago'])
index = GPTSimpleVectorIndex.from_documents(documents)
【注意】Ver.0.6.0以降の場合
上記のままだとエラーになる。
以下のとおり書き換えて実行する。(赤文字が変更箇所)
# Open AIのAPIキーを設定
import os
os.environ["OPENAI_API_KEY"] = 'YOUR_OPENAI_API_KEY'
# LlamaIndexのインポート
from llama_index import GPTVectorStoreIndex, download_loader
# WikipediaReaderを準備
WikipediaReader = download_loader("WikipediaReader")
# インデックスファイルを生成
loader = WikipediaReader()
documents = loader.load_data(pages=['Berlin', 'Rome', 'Tokyo', 'Canberra', 'Santiago'])
index = GPTVectorStoreIndex.from_documents(documents)
日本語対応方法は以下で詳しく解説されている。
各種アプリ
さまざまなアプリのデータを使ってインデックスを生成できる✅
代表的なアプリ
その他
インデックスのカスタマイズ
インデックスの生成をするときに細かい情報を設定できる✅
LLMの設定
LLMPredictor(…)
で設定できる。
# Open AIのAPIキーを設定
import os
os.environ["OPENAI_API_KEY"] = 'YOUR_OPENAI_API_KEY'
# ✅インポート
from llama_index import GPTSimpleVectorIndex, SimpleDirectoryReader, LLMPredictor, ServiceContext
from langchain import OpenAI
# ---------------------------------------------------------
# 手順1(インデックスを用意)
# ---------------------------------------------------------
# 学習データを読み込む
documents = SimpleDirectoryReader('document_sample.txt').load_data()
# ✅LLMの設定を準備
llm_predictor = LLMPredictor(llm=OpenAI(
temperature=0, # 回答の多様性(0〜1)
model_name="text-davinci-002", # モデル
max_tokens=256)) # 最大トークン数
service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor)
# ✅インデックスを生成(LLM設定反映)
index = GPTSimpleVectorIndex.from_documents(documents, service_context=service_context)
# ---------------------------------------------------------
# 手順2(インデックスを使って質問)
# ---------------------------------------------------------
# 質問を実行
response = index.query("◯◯について教えて")
print(response)
【注意】Ver.0.6.0以降の場合
上記のままだとエラーになる。
以下のとおり書き換えて実行する。(赤文字が変更箇所)
# Open AIのAPIキーを設定
import os
os.environ["OPENAI_API_KEY"] = 'YOUR_OPENAI_API_KEY'
# ✅インポート
from llama_index import GPTVectorStoreIndex, SimpleDirectoryReader, LLMPredictor, ServiceContext
from langchain import OpenAI
# ---------------------------------------------------------
# 手順1(インデックスを用意)
# ---------------------------------------------------------
# 学習データを読み込む
documents = SimpleDirectoryReader('document_sample.txt').load_data()
# ✅LLMの設定を準備
llm_predictor = LLMPredictor(llm=OpenAI(
temperature=0, # 回答の多様性(0〜1)
model_name="text-davinci-002", # モデル
max_tokens=256)) # 最大トークン数
service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor)
# ✅インデックスを生成(LLM設定反映)
index = GPTVectorStoreIndex.from_documents(documents, service_context=service_context)
# ---------------------------------------------------------
# 手順2(インデックスを使って質問)
# ---------------------------------------------------------
# 質問を実行
query_engine = index.as_query_engine()
response = query_engine.query("◯◯について教えて")
print(response)
今までと異なる箇所
- ✅インポート
LLMPredictor
とServiceContext
とOpenAI
が必要。 - ✅LLMの設定を準備
LLMPredictor(…)
でLLMの設定を準備する。 - ✅インデックスを生成(LLM設定反映)
引数にservice_context
を指定することでLLMの設定が反映できる。
【詳細な解説】
公式ドキュメント(関数の詳細)
公式ドキュメント(使用例)
プロンプトの設定
PromptHelper(…)
で設定できる。
# Open AIのAPIキーを設定
import os
os.environ["OPENAI_API_KEY"] = 'YOUR_OPENAI_API_KEY'
# ✅インポート
from llama_index import GPTSimpleVectorIndex, SimpleDirectoryReader, PromptHelper, ServiceContext
from langchain import OpenAI
# ---------------------------------------------------------
# 手順1(インデックスを用意)
# ---------------------------------------------------------
# 学習データを読み込む
documents = SimpleDirectoryReader('document_sample.txt').load_data()
# ✅プロンプトの設定を準備
prompt_helper = PromptHelper(
max_input_size=4096, # LLM入力の最大トークン数
num_output=256, # LLM出力のトークン数
max_chunk_overlap=20 # チャンクオーバーラップの最大トークン数
chunk_size_limit=2000 # チャンクのトークン数
separator="。" ) # セパレーター
service_context = ServiceContext.from_defaults(prompt_helper=prompt_helper)
# ✅インデックスを生成(プロンプト設定反映)
index = GPTSimpleVectorIndex.from_documents(documents, service_context=service_context)
# ---------------------------------------------------------
# 手順2(インデックスを使って質問)
# ---------------------------------------------------------
# 質問を実行
response = index.query("◯◯について教えて")
print(response)
【注意】Ver.0.6.0以降の場合
上記のままだとエラーになる。
以下のとおり書き換えて実行する。(赤文字が変更箇所)
# Open AIのAPIキーを設定
import os
os.environ["OPENAI_API_KEY"] = 'YOUR_OPENAI_API_KEY'
# ✅インポート
from llama_index import GPTVectorStoreIndex, SimpleDirectoryReader, PromptHelper, ServiceContext
from langchain import OpenAI
# ---------------------------------------------------------
# 手順1(インデックスを用意)
# ---------------------------------------------------------
# 学習データを読み込む
documents = SimpleDirectoryReader('document_sample.txt').load_data()
# ✅プロンプトの設定を準備
prompt_helper = PromptHelper(
max_input_size=4096, # LLM入力の最大トークン数
num_output=256, # LLM出力のトークン数
max_chunk_overlap=20 # チャンクオーバーラップの最大トークン数
chunk_size_limit=2000 # チャンクのトークン数
separator="。" ) # セパレーター
service_context = ServiceContext.from_defaults(prompt_helper=prompt_helper)
# ✅インデックスを生成(プロンプト設定反映)
index = GPTVectorStoreIndex.from_documents(documents, service_context=service_context)
# ---------------------------------------------------------
# 手順2(インデックスを使って質問)
# ---------------------------------------------------------
# 質問を実行
query_engine = index.as_query_engine()
response = query_engine.query("◯◯について教えて")
print(response)
今までと異なる箇所
- ✅インポート
PromptHelper
とServiceContext
とOpenAI
が必要。 - ✅プロンプトの設定を準備
PromptHelper(…)
でプロンプトの設定を準備する。 - ✅インデックスを生成(プロンプト設定反映)
引数にservice_context
を指定することでプロンプトの設定が反映できる。
【詳細な解説】
公式ドキュメント(関数の詳細)
公式ドキュメント(使用例)
実践
公式で色々なパターンの実装方法が紹介されている。
- 💬🤖 チャットボットの作り方
- LLamaIndex を使用してフルスタック Web アプリを構築するためのガイド
- Delphic を使用してフルスタックの LlamaIndex Web アプリを構築するためのガイド
- LlamaIndex + 構造化データのガイド
- 用語と定義を抽出するためのガイド
- インデックスに対する統合クエリ フレームワークを作成するためのガイド
- SEC 10k 分析
参考サイト
基本的な使用方法
ある程度理解してから読むと理解が深まる
LlamaIndexの内部的な部分
実践
役に立ちそうなTips
Ver.0.6.0での変更