ソニックの部屋

主にプログラミングに関する記事を投稿します

「ChatGPT/LangChainによるチャットシステム構築[実践]入門」を読む

気になった用語等をまとめる

第1章_LLMを使ったアプリ開発

学んだこと

  • LLMとはLarge Language Model
  • チャットボット、文章の要約、QA、AIエージェント等

第2章_プロンプトエンジニアリング

学んだこと

  • プロンプトエンジニアリングガイドで紹介されている主な手法
種類 特徴
Zero-shot プロンプトに例を与えない
Few-shot プロンプトに例を与える(特定の形式で応答させるため)
Zero-shot CoT 一言(ステップバイステップなど)追加する(正確に応答させるため)

第3章_ChatGPTのAPI利用

学んだこと

  • Function calling機能
    • LLMに関数を使いたいと判断させる(Agentsに似ている)
    • 応用でJSON形式のデータを生成させる

第4章_LangChain基礎

学んだこと

  • 6つのモジュール
名称 機能
Model I/O ・Language models
・Prompts
・Output parsers
Chains
Memory
Data connection(現在:Retrieval)
Agents
Callbacks
  • 以下の3つのサブモジュールは根幹となるモジュール
  • ①Language modelsについて
    • LLMsは一つのテキスト入力に一つのテキスト出力を返す→OpenAIクラスを使用
    • Chat modelsはチャット形式の入力に応答を返す→ChatOpenAIクラスを使用
    • Callback機能でストリーミング出力が可能
  • ②Promptsについて
    • プロンプトのテンプレート化→ChatPromptTemplateを使用(Chat Completions API形式)
  • ③Output parsersについて
    • プロンプトに出力形式を埋め込む→PydanticOutputParserを使用
    • Chat Completions APIの場合はFunction calling機能を利用して出力形式を指定した方がよい
  • Chainsについて
    • LLMChainは上記①ー③をつなぐ
    • SimpleSequentialChainでChain同士を直列に繋ぐ(例えばステップバイステップで考えさせてその後要約させる)
  • Memoryについて
    • Chat Completions APIはステートレスなため会話履歴を保存するにはMemoryが便利
    • 保存先はデフォルトでメモリとなるため永続化させるためにはDBが必要
    • 会話履歴に対してプロンプトの長さ制限への対応が必須

第5章_LangChain応用

学んだこと

  • Data connectionについて
    • LLMと外部データを接続するための機能
    • その中でRAGとは入力をベクトル化しそのベクトルと近いDB・外部データをプロンプトに含める手法
  • Data connectionの手順
    • ①ドキュメントの読み込み→色々なソース元から色々なデータを読み込める
    • ②ドキュメントの変換・ベクトル化→ベクトル化にはOpenAIのEmbeddings APIを使う
    • ③ドキュメントの保存
    • ④ドキュメントの検索
    • ⑤ドキュメントを踏まえて回答させる→RetrievalQAを使う
  • Agentsについて
    • LLMがどのツールを使うか判断して動作する(例えばDBから検索するのか、外部から検索するのか)
    • 固定的な処理の流れを実現するChainsとは対照的

第6章_外部検索・履歴を踏まえた応答をするWebアプリの実装

学んだこと

  • (参考)ホストする=サーバーを立ててデプロイする
  • (参考)Cloud9はIDE(無料)、EC2は仮想サーバー(有料)
  • (参考)GitHubにプッシュする際はSSHでないと毎回ユーザー名やパスワードが求められる
  • Streamlit Community CloudにWebアプリをデプロイする

第7章_ストリーム形式で履歴を踏まえた応答をするSlackアプリの実装

学んだこと

  • アプリの構成→サーバーレスアーキテクチャとする
    • Slack Bolt for PythonとLangChainをAWS Lambdaにデプロイ・稼働
    • LLMはChat Completions API
    • 会話履歴はキャッシュとしてMomentoを利用
  • (参考)アーキテクチャとは設計思想のこと
  • (参考)サーバーレスとはサーバー構築(OS, DB, ネットワーク等)が不要なこと
  • (参考)Slack Bolt for PythonとはSlackアプリを簡単に構築するためのフレームワーク
  • (参考)AWSのEC2とLambdaはいずれもアプリを動かす基盤となるものだが、LambdaはOS等のセットアップが不要(=サーバーレス)
  • ストリーミングレスポンスの重要な仕組み
    • サーバーへのリトライ処理により重複して回答が来てしまう
    • Lazyリスナー関数でAWS LambdaのようにHTTPレスポンスを返すと処理が終了するのを抑止し単純応答を返した後も処理を継続する→実装はシンプル
  • 生成系AIの利用をUIで明示することが重要

第8章_社内文書に答えるSlackアプリの実装

学んだこと

  • 検索結果をそのまま表示するか、RAGにより要約するかは設計時に要検討
  • アプリの構成→サーバーレスアーキテクチャとする
    • 7章の実装+ベクターDBのPineconeより情報を検索して回答させる
  • LLMに「会話履歴+質問」から質問をあらためて生成させる→会話履歴を踏まえた応答が返ってくる

第9章_LLMアプリの本番リリースに向けて

学んだこと

  • 自社ガイドラインの作成→禁止事項を明確にし利用を推進する
  • 外部サービスの利用規約を守る→Chat Completions APIを呼ぶ前後にModeration APIでチェックする
  • CI/CD(特にCIのモデルの評価)→Evaluationで回答のスコアリング、LangSmithで性能監視
  • 様々なセキュリティ対策→プロンプトインジェクション、DoS攻撃
  • 個人情報保護→完璧に防ぐのは限界があるので注意書きをわかりやすい場所にする

参考文献
吉田 真吾 (著), 大嶋 勇樹 (著)/技術評論社/2023/ChatGPT/LangChainによるチャットシステム構築[実践]入門
はるすと/2023年11月24取得/ホストとは?デプロイ・リリースとの違いも初心者向けにわかりやすく解説
江戸達博/2023年11月26取得/サーバーレスとは何か? EC2とLambdaの違いも解説
@YotaHamasaki(yoo2315)/2023年11月26取得/Cloud9でインスタンスの再起動をしても繋がらない時