ltmemo

ChatGPT雰囲気で触る

tags: 機械学習LLM
2023-07-09

ToC

何を学ぶか

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に任されたイメージだなぁ


最終更新: 2023-07-23