Slide 1

Slide 1 text

GPT/LangChain/LlamaIndexを活用しDB 作業の生産性10倍を考える GPT Okinawa

Slide 2

Slide 2 text

自己紹介 ● 〜2011:飲食業 ● 2012年:株式会社プロトソリューション ● 2018年:株式会社EC-GAIN ● 2020年:CTO就任 ● 現在  :開発組織構築奮闘中 神谷 築(カミヤ キズク) 1991年:31歳 4人の子持ち お酒/ラーメン大好き

Slide 3

Slide 3 text

GPT Okinawa Mission GPTを使って開発生産性を10倍にしたい

Slide 4

Slide 4 text

Slack

Slide 5

Slide 5 text

今日の流れ - LangChain/LhamaIndex解説 - LT - ディスカッション

Slide 6

Slide 6 text

GPT の課題 最新情報や独自の情報を持っていない

Slide 7

Slide 7 text

GPT の課題に対するアプローチ - Fine -tuning - In-Context Learning

Slide 8

Slide 8 text

Fine-tuning モデル自体にデータを与えて再学習させる方法

Slide 9

Slide 9 text

In-Context Learning 情報を先に与えておいて、GPTにアプローチする方法

Slide 10

Slide 10 text

今回の話 In-Context Learning

Slide 11

Slide 11 text

使うツール LangChain LhamaIndex

Slide 12

Slide 12 text

LangChainとは LangChainは、GPT-3のような大規模言語モデル( Large Language Model: LLM)を利用してサービスの開発 をしたいときに便利に使えるライブラリです。 例えば、ChatGPT のような AI とチャットできるサービスを開発する場合を考えます。 OpenAI が提供する GPT-3 の API だけでも非常にシンプルで使いやすいので、 GPT-3 のみを使用した AI チャットサービスを開発 するには LangChain は不要かもしれません。 しかし、例えば、開発したいチャットアプリの要件に、「最新の検 索結果の内容も踏まえて AIに返答をさせたい」といった条件が追加された場合には LangChain が有効です。 LangChain には、「検索エンジンでの検索結果を API で返してくれるサービス」である SerpApi と LLM を組み 合わせる機能があります。 この機能を使うことで、よくある「最新の検索結果の内容も踏まえて AI に返答をさせ たい」という要望を数行のコードで実装できます。 このように、LangChain は LLM を使ってサービスを開発したいときのよくある機能をまとめて提供してくれてい るライブラリです。 引用:https://book.st-hakky.com/docs/langcain-intro/

Slide 13

Slide 13 text

LangChain要約 GPTを簡単に扱えるようにする 便利なやつ

Slide 14

Slide 14 text

LhamaIndexとは GPTのようなLLMにプライベートなデータを補強するために、in-context learningという 枠組みがあり、これを行うには データの取り込み インデックス化が必要 ということです。そこで、このデータの取り込み、インデックス化、またそのインデックスを 利用して質問(クエリ)に回答するところまでの機能を一気通貫で提供してくれるのが LlamaIndex、となります。 引用:https://dev.classmethod.jp/articles/llamaindex-overview/

Slide 15

Slide 15 text

LhamaIndex要約 in-context learning を簡単にできるやつ

Slide 16

Slide 16 text

プログラムのステップ - テキストを分割 - embeddingとretrieverの作成 - gptの実行

Slide 17

Slide 17 text

テキストを分割 def file_text_split (file_path): # テキストローダーの初期化 loader = TextLoader(file_path) # ドキュメントの読みこみ documents = loader.load() # チャンクサイズの制限を下回るまで再帰的に分割するテキストスプリッターのインポート from langchain.text_splitter import RecursiveCharacterTextSplitter # テキストスプリッターの初期化 text_splitter = RecursiveCharacterTextSplitter( chunk_size=400, chunk_overlap=0) # テキストをチャンクに分割 return text_splitter.split_documents(documents)

Slide 18

Slide 18 text

embeddingとretrieverの作成 # retriever作成 def create_retriever (text_split): # 使用するエンベッディングをインポート from langchain.embeddings import OpenAIEmbeddings # エンベッディングの初期化 embeddings = OpenAIEmbeddings() # vectorstore をインポート (ここでは Chroma を使用) from langchain.vectorstores import Chroma # ベクターストアにドキュメントとエンベッディングを格納 db = Chroma.from_documents(text_split , embeddings) return db.as_retriever()

Slide 19

Slide 19 text

gptの実行 def execute_gpt(prompt, text_retriever): from langchain.chains import RetrievalQA # LLM ラッパーの初期化 llm = OpenAI(model_name="gpt-4", temperature=0, max_tokens=5000) # チェーンを作り、それを使って質問に答える qa = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=text_retriever) return qa.run(prompt)

Slide 20

Slide 20 text

実行プログラム if __name__ == '__main__': texts = file_text_split( 'dump.sql') retriever = create_retriever(texts) answer = execute_gpt( ''' select_items の最新10件を取得するSQLを作成してください。 select_items にはambassadorsテーブルの情報も含めてください。 ''', retriever) print(answer)

Slide 21

Slide 21 text

実行結果 SELECT s.*, a.display_name, a.profile_image, a.select_item_count, a.affiliate_type FROM select_items s JOIN ambassadors a ON s.ambassador_id = a.id ORDER BY s.created_at DESC LIMIT 10;

Slide 22

Slide 22 text

感想 おおお!

Slide 23

Slide 23 text

読み込ませたdump.sql データベースのdumpデータを食わせた。 185,426文字のデータ

Slide 24

Slide 24 text

テキスト分割について 全てのテキストを一回で処理する事が制限されておりできない。 意味のある単位で、テキストをある程度分割する必要がある。 今回は適当に分割してみた。

Slide 25

Slide 25 text

embeddingとretrieverについて embeddingとは文字をベクトル表現に変換すること 雑に言うと文字が下記のようにマシンが処理しやすい形で管理されるようになる [0.002369190799072385, -0.004423773847520351] retrieverとは、情報を検索して言語モデルに情報を渡せるやつ。 今回だと、GPTの言語モデルにsql dumpのデータを検索して渡している。 正直、内部の詳細はわかっていない。

Slide 26

Slide 26 text

まとめ - In-Context Learningの実装は難しくない(テキストデータが必要) - ChatGPTには投げられない量のデータを扱える

Slide 27

Slide 27 text

最後に でかい独自のテキストデータと GPTを簡単に組み合わせる事ができる 色々な活用方法がありますよね!

Slide 28

Slide 28 text

以上!