Penpen7のブログ

Penpen7のエンジニアブログ

📚 Software Design 8月号 読書メモ

はじめに

今回もSoftware Design輪読会に参加するため、Software Designを読んできました。
第一特集と第二特集以外はあまり読めていない…

第1特集LangChainではじめるLLMアプリ開発入門

…… 松本 和高

第1章:LLMの基本主要技術・種類と性能・プロンプトテクニックなど

  • LLM開発合戦
    • ChatGPTが出てから一気にいろんな選択肢が出てきましたよねぇ
  • アプリケーション開発も盛んになってきた
    • Perplexity AI
    • Dify
    • 自分も便利に使わせてもらっています
    • 開発するためのフレームワーク(LangChainなど)
  • LLMで使用されている技術
    • Transformer
      • 文章中の重要な情報に注目する仕組み
    • 自己教師あり学習
      • 穴埋め問題を解く
    • 冪乗則
      • 言語モデルの性能が予測可能になり、開発のリスクを減らすことができるようになった
    • Instruction Tuning
    • LoRa(Low-Rank Adaptation)
  • LLMのハンズオン
    • GPT
    • Claude
      • モデルごとに特性が異なる
    • Gemini
  • LLMの性能評価
    • LMSYS Chatbot Arena
    • Nejumi LLMリーダーボードNeo
  • プロンプトテクニック
    • Few-Shot Prompting
      • いくつかの例を与えて回答を得る
    • CoT(Chain of Thought)
      • 推論のステップを与えて最終的な答えを得る
    • RAG(Retrieval Augmented Genration)
      • 学習データ以外の知識を与えて回答させる

第2章:入門LangChain主要コンポーネントの使い方をマスターする

  • LangChain
    • LLMを使用しやすくするためのライブラリという理解?
    • Rustバージョンもあるようだ

https://github.com/Abraxas-365/langchain-rust

  • LangChain Component
    • Message
      • ロールごとにメッセージが存在
    • Chat Model
      • 言語モデルを抽象化したもの
    • Prompt Template
      • あらかじめ用意したテンプレートでパラメータによって動的に変換したい場合に使用
    • Document Loader
      • 特定のソースからコンテンツを読み出す
    • Text Splitter
      • テキストをチャンクに分割するコンポーネント
    • Embedding
      • テキストを数値ベクトル表現に変換
    • Retriever
      • 与えられたクエリからドキュメントを返す
      • 検索機能とLCELを使える
    • Toolがよくわからなかった
      • メッセージから、その関数の呼び出しに必要な引数をLLMを使って作るだけ
      • 実際に引数を指定して呼び出すところは後からコードを書く必要があるみたい

第3章:LangChain+Streamlitを使った翻訳アプリの実装少ないコードで手軽に開発してみよう

  • Streamlitを初めて使いましたが、気軽にSPAなwebアプリケーションを作ることができて便利ですねー
  • Session StateがReactでいうuseStateのようなものかと思ったが、完全理解してみたい

第4章:LangChain+Next.jsを使った検索アプリの実装簡易版AIアプリケーションのAPI,UIを作ろう

  • LangServeなど様々便利モジュールがある
    • PythonはLLM周りのアプリケーション開発が強いなと実感した
  • 色んな内容がもりもりなので、まだ理解しきれていない
    • LangGraphとか…

第5章:LCELと高度なLangChainコンポーネントワンランク上のアプリを開発するための応用知識

  • LCEL
    • LangChain独自の構文
  • Runnableインターフェースを実装する必要がある
  • RunnableSequence
    • __or__ を実装することで|で繋げることができる
  • パイプを利用してチェーンの動作を自在に変更できる
  • FewShotTemplateでFew-shot Promptingを利用できるらしい
    • 至れり尽くせり
  • OutputFixingは自動でLLMを使ってプロンプトを修正できる
  • UnstructuredPDFLoader
    • 非構造化データを構造化データに変換しLLMフレームワークで利用できるようにする
  • 全て理解し切れたわけではないですが、LLMアプリケーションを作りたいときにぜひ参考にさせていただきたい内容でした!

第2特集Web開発にCDNエッジをオススメする理由低遅延とパフォーマンスを両立させる技術

第1章:CDNエッジとWebアプリの関係性Web開発に活きるCDNの強みとは…… 小澤 泰河

  • CDNは1990年代後半に登場
    • しばらくは静的webサイトを配信する仕組みとして使用
    • CSRが普及していたことでCDNが使用されるようになった
    • SSR→CSR + Web API構成
  • ユーザーの近くのエッジロケーションに誘導する仕組み
    • DNSを利用する
    • 動的に最寄りのエッジロケーションのIPに変換する
    • IPエニーキャストも使用されている
    • 例示に使用できるIPアドレスブロックがあるらしい
  • CDN
    • AWS=Amazon CloudFront
    • GCP=Cloud CDN
    • Cloudflare CDN
  • エッジランタイム
    • エッジサービス上でコードを実行できる
    • CloudFront Functionsなんてサービス出てたんですね
    • 複雑な処理もできるようになってきた
    • リバースプロキシやAPIゲートウェイ的な存在と解釈できる…なるほど
  • オリジンサーバで動かすべき処理と、エッジで動かすべき処理をどう区別をつければいいのかよくわからない
    • WASMによってサーバサイドとフロントエンドが融合しつつある感じがあるので、その一環なのか
  • CDN熱いっすね!

第2章:FastlyによるCDNエッジハンズオンサービスの作成からバックエンドリクエストまで…… 井手 優太

  • Fastly

    • エッジ上でのソリューション提供に強み
    • キャッシュが強い
  • CDN or Fastly Compute

    • CDN
      • VCL(Varnish Configuration Language)
        • 設定記述言語で使いにくいらしい
      • 安い
        • リクエスト数のみ課金
    • Fastly Compute
      • WASMに変換でき
      • エミュレータでローカル開発環境しやすい
      • 時間で課金されるため、実行時間を短くするためのチューニングを頑張る
  • サービス

  • ハンズオンのメモ

    • webpackがうまく動かなかったので、以下の手順を追加

      npm init
      npm install
      fastly compute publish --service-id=****
      
    • コンソール上のURLをクリックすると遷移可能

  • SimpleCache.getOrSet関数でキャッシュ

    • 使用できるキャッシュは3つ
    getOrSet(key: string, set: () => Promise<{value: BodyInit, ttl: number}>):Promise<SimplaCacheEntry>
    
  • バックエンドリクエスト

    • オリジンサーバーへの接続はStatic BackendとDynamic Backendの2つ

    • Static Backend

      • オリジンに固定の名前をつけて呼び出すことが可能

      • ただしソースコード上でもURLを書かないといけないので二度手間

      • 試しにbackendを消すと動かなくなった

        Error while running request handler: No backend specified for request with url https://sd-writing-origin-server-5vaznax7ka-an.a.run.app/. Must provide a `backend` property on the `init` object passed to either `new Request()` or `fetch`
        
    • Dynamic Backend

      • fetchで任意のURLを渡せるようにできる
      • サポートに連絡する必要あり
    • 全てDynamic Backendでよいのでは…という気持ち

      • Static Backend二度同じことを書くの面倒じゃない?
        • サードパーティのjsが勝手に変なエンドポイントにfetchするのを防ぐというメリットがあるらしい(メリットなのか…?)
        • サードパーティのjsでfetchが書いてあったらいちいちbackendを指定しないといけないってコト…?

第3章:CDNエッジをリバースプロキシとして活用する負荷対策やコンテンツの出し分けもエッジで対応…… 林 仁

  • 日経新聞ではCDNを駆使している
  • Varyヘッダを返すことでヘッダをキャッシュキーにできる
    • ミドルウェアを実装して漏れを防ぐ…なるほど
    • 出したいものによって後からjsで入れ込むことも検討
      • 人によって変わるコンテンツはそうするしかないっすよねぇ…
    • フロントエンドとバックエンドを強化するものとしてエッジコンピューティングを捉えると良い…なるほど…
  • エッジコンピューティングの注意
    • メモリや実行時間の制限
    • 他のサーバに問い合わせる処理がエッジコンピューティング
まだ読めていないもの

連載

ITエンジニア必須の最新用語解説【188】Kotlin 2.0……杉山 貴章

万能IT技術研究所【27】現在と過去を重ねて,地理空間情報で歴史を楽しむ――そうだ,京都と大阪,行ってみよう。……万能IT技術研究所

ドメイン解体新書【7】ドメイントラブルシューティング① ドメイン管理のトラブル……谷口 元紀

ハピネスチームビルディング【29】ワーキングアグリーメントで価値観の相互理解を深めよう……小島 優介

エンジニアのためのやる気UPエクササイズ【24】エンジニア必見! 座ってできる姿勢改善トレーニング……えくろプロテイン

レガシーシステム攻略のプロセス【4】ZOZOTOWNリプレイスにおけるマスタDBの移行……渋谷 宥仁,裵 城柱

Databricksで勝つデータ活用【5】Databricksのデータマネジメント……北岡 早紀

あなたの知らないChromeの世界【7】Spectre以降のブラウザベンダーの取り組みとChrome……小河 亮

ぼくらの「開発者体験」改善クエスト【8】データドリブンなプロダクト開発を支えるABテスト基盤の改善……七五三 航

実践データベースリファクタリング【9】サービスの成長と肥大化するデータ……曽根 壮大

Cloudflare Workersへの招待【9】Cron TriggersでWorkerを定期実行してみよう……福岡 秀一郎

実践LLMアプリケーション開発【11】LangGraphのcreate_react_agentでエージェント開発を省力化……西見 公宏

AWS活用ジャーニー【23】Amazon RDSの高可用性……杉金 晋

【新連載】基礎からわかるDetection Engineering【1】Detection Engineeringの理論と概念……石川 朝久

成功するPSIRTの極意【3】Agile開発組織のセキュリティ,freee PSIRTが取り組むShift Left……yu fujioka

魅惑の自作シェルの世界【21】ifコマンドの実装……上田 隆一

あなたのスキルは社会に役立つ~エンジニアだからできる社会貢献~【152】台湾のシビックテックの祭典「g0v サミット2024」参加レポート……明主 那生

© Penpen7