ChatGPT雰囲気で触る
tags: 機械学習LLMToC
何を学ぶか
ChatGPTのAPIでできることについてまとめる
主に文章の感情分析や分類を手軽にできるんじゃないかというとことに興味がある
使い方を把握していないので、まずはそこから
APIのモード
APIにはいくつかモードがある
- Chat
- Insert
- Edit
- Complete
Chat以外は7/6時点だとlegacyなようだ
全部統一なのかと思いきや、Chatの応答だったりEmbeddingの出力だったり思ってたより色々ある
モデルの種類
chatならgpt-3.5-turbo、のようにモデルがちょいちょい違う
gpt3.5と4.0は5月時点でファインチューニングができない。やるにしても結構なサイズのRAMがあるGPUが必要なはず
embeddingで使うモデルはtext-embedding-ada-002
が安くて精度が良い
パラメータ
- Temperature
- 生成する内容のランダムさ。0.9とかにすると創造的になる
- Maximum length
- 出力する最大トークン数。節約にも使えそう
- stop sequence
- この文字が出たら生成を停止する
token数
gptが扱う文章の単位。あ、で1tokenというような単純な感じではなく、日本語はtoken数が多い(ざっくり英語の2倍)
tokenの数は、tiktokenというライブラリを使うと算出できる
日本語のほうがコストが高いが、英語よりも文章が短くても良かったりするので実際はトントンらしい
LlamaIndex
基本的な使い方
- loggingのlevelをDEBUGにしておくと捗る
- SimpleDirectoryReaderでlocalのファイルをDocumentクラスに変換できる
- 複数のtxtファイルがあっても読み込んでくれる。楽
- ChatGPTのtoken上限があるので、それを超えそうな場合はチャンクに分割される
- GPTVectorStoreIndexでindexをDocument[]から作れる
- この際にもトークンを消費する。embeddingのtokenが使われているのが確認できた
- indexからas_query_engineでqueryエンジンを生成し、これに対して質問ができる
- logの出力から見た感じ、indexから参考のdocumentを索引、その内容をcontextとして埋め込んで、GPTに問い合わせ、という感じのようだ
- 簡単な質問でもcontextが大きいので543トークン使ってた。一旦token数は考えないようにしよう
- 標準のpromptはLlamaIndexの
default_prompts.py
で定義されている - queryの結果の.response、.source_nodesで結果と、参考にしたデータが取得できる
- 作ったstorageはlocalに保存できる
- 置き場はs3も選べるみたい
- Document型って?
- text以外にembeddingやextra_infoといった情報を持っている
あくまで応答なので、queryに固有名詞がないとキツイかも? 一応物語の概要とかは出してくれるけど
LLMPredictorを作るときにChatOpenAIクラスを投げ込めるので、独自のエンドポイント呼び出すときはこいつを使うと良さそう
embeddingにはHuggingFaceのものも使える。精度は知らんが無料である
RAG(Retrieval Augmented Generation)
knowledgeベースからRelevantContextを通ってLLMに情報を渡す仕組みのイメージ
Llamaはここをつなぐ仕組みを用意してくれている
IndexingStageでは
DataSource -> DataLoader -> Documents -> Indexing -> KnowledgeBase
という流れのイメージらしい
特にDocumentがデータを抽象化するレイヤーみたいで、PDFとかAPIのresponseとかを表現する
逆のQueryingStageでは、
KnowledgeBase -> Retriever -> Node Postprocessor->ResponseSynthesizer->QueryEngine|ChatEngine
という流れの模様。Node Postprocessorが取得した文字列をfilterしたりrerankしたりできるそうだ
ResponseSynthesizerはLLMの予備ダサいれいやっぽい
Nodeはtextの文字列とmetadataとrelationshipsを抽象化する軽量な仕組みだそう
今までの検索エンジンの仕組みで、queryがpromptになって、実行がLLMに任されたイメージだなぁ