Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
【Gen-AX】20250417開催_Findyオンラインイベント_Rust開発の裏側 各社が...
Search
Gen-AX株式会社
May 08, 2025
Technology
0
30
【Gen-AX】20250417開催_Findyオンラインイベント_Rust開発の裏側 各社が語る課題と今後の挑戦とは
2025.04.17に開催された、Findyオンラインイベント「Rust開発の裏側 各社が語る課題と今後の挑戦とは?」のGen-AX株式会社の登壇資料です。
Gen-AX株式会社
May 08, 2025
Tweet
Share
More Decks by Gen-AX株式会社
See All by Gen-AX株式会社
【Gen-AX】Gen-AX株式会社_採用カンパニーデック
genax
0
4.1k
【Gen-AX】20250514開催_Findyオンラインイベント_技術選定を突き詰める
genax
0
2.1k
【Gen-AX】Gen-AX株式会社_カンパニーデック
genax
0
980
Other Decks in Technology
See All in Technology
M365アカウント侵害時の初動対応
lhazy
6
4.5k
Microsoft Fabric ガバナンス設計の一歩目を考える
ryomaru0825
1
260
QAを早期に巻き込む”って どうやるの? モヤモヤから抜け出す実践知
moritamasami
2
180
Step Functions First - サーバーレスアーキテクチャの新しいパラダイム
taikis
1
270
2025/07/22_家族アルバム みてねのCRE における生成AI活用事例
masartz
2
100
大規模組織にAIエージェントを迅速に導入するためのセキュリティの勘所 / AI agents for large-scale organizations
i35_267
6
220
TROCCO今昔
gtnao
0
210
なぜAI時代に 「イベント」を中心に考えるのか? / Why focus on "events" in the age of AI?
ytake
2
480
「手を動かした者だけが世界を変える」ソフトウェア開発だけではない開発者人生
onishi
7
2.7k
分散トレーシングによる コネクティッドカーのデータ処理見える化の試み
thatsdone
0
190
PHPでResult型やってみよう
higaki_program
0
190
OTel 公式ドキュメント翻訳 PJ から始めるコミュニティ活動/Community activities starting with the OTel official document translation project
msksgm
0
220
Featured
See All Featured
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
Designing for Performance
lara
610
69k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
8
710
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
126
53k
Agile that works and the tools we love
rasmusluckow
329
21k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
8
370
Testing 201, or: Great Expectations
jmmastey
43
7.6k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
How to Think Like a Performance Engineer
csswizardry
25
1.8k
Intergalactic Javascript Robots from Outer Space
tanoku
271
27k
Transcript
© Gen-AX Corp. All Rights Reserved. 1 B2B向け⽣成AI SaaSプロダクト開発で Rust採⽤の理由
2025年4⽉17⽇ テックリード 中村秀樹
© Gen-AX Corp. All Rights Reserved. 2 ⾃⼰紹介 • 中村
秀樹 • テックリード • Gen-AX(ジェナックス)初期⽴ち上げメンバー • 組込エンジニアからキャリアをスタートして、Web系へ • Rust歴 1.5年 • 猫好き • “さかがみ家”でお世話した保護猫の最初の⾥親
© Gen-AX Corp. All Rights Reserved. 3 本発表で話すこと • Rustで開発しているプロダクトの概要
• Rust採⽤の理由 • Rustでの開発の良い点・悪い点
© Gen-AX Corp. All Rights Reserved. 4 会社紹介 ※ ジェナックスと読みます
※
© Gen-AX Corp. All Rights Reserved. 5 Gen-AXのプロダクト
© Gen-AX Corp. All Rights Reserved. 6 X-Boost(クロスブースト) • コンタクトセンター特化型のRAG
RAG: Retrieval-Argumented Generation
© Gen-AX Corp. All Rights Reserved. X-Boost(クロスブースト) • 検索データの作成、AIモデルのファインチューニングをセルフサービスで実⾏可能 7
© Gen-AX Corp. All Rights Reserved. 8 X-Boost システム構成図
© Gen-AX Corp. All Rights Reserved. 9 X-Boost 技術スタック Frontend
• Typescript • Next.js Backend • Rust • axum IdP • Keycloak AI • Python 開発環境 • Cloud︓Azure • GitHub Enterprise(Cloud) • Monorepo開発 • CI︓GitHub Actions • CD︓ArgoCD • Notion/Jira
© Gen-AX Corp. All Rights Reserved. 10 X-Boost 技術スタック Frontend
• Typescript • Next.js Backend • Rust • axum IdP • Keycloak AI • Python 開発環境 • Cloud︓Azure • GitHub Enterprise(Cloud) • Monorepo開発 • CI︓GitHub Actions • CD︓ArgoCD • Notion/Jira レガシーコードをRustに移⾏するのではなく、 Backendの新規開発で”Rust“を採⽤
© Gen-AX Corp. All Rights Reserved. 11 なぜRustを選んだのか︖ • 技術選定⽅針
① チーム開発に最適な静的型付け⾔語を前提 ② 関数型的アプローチを取り⼊れて質の⾼いコードを⽬指す • 関数型⾔語を採⽤する意味ではない • 具体的には・・・ • 型の表現⼒を⽣かす • Railway Oriented Programmingによるエラーハンドリング BtoB向けSaaS ⾼信頼な製品が求められる 開発対象
© Gen-AX Corp. All Rights Reserved. 12 Railway Oriented Programming(ROP)とは
• 成功時の結果とエラーの両⽅を扱える”Result型”を関数の戻り値にする書き⽅で、処理 のパイプラインを構築するという設計⼿法 • Webアプリでよく⾒かける、エラーが発⽣する可能性がある関数を複数回呼び出し、エ ラーが発⽣したらエラーレスポンスを返すような実装に向いている • メリット • エラーハンドリングの実装をシンプルにでき、正常系処理の流れの⾒通しをよくする F# for Fun and Profit Railway Oriented Programmingより(https://fsharpforfunandprofit.com/rop/)
© Gen-AX Corp. All Rights Reserved. 13 なぜRustを選んだのか︖ ① チーム開発に最適な静的型付け⾔語
Java Kotlin Go Rust Java Kotlin Go Rust Python Ruby Javascript Typescript
© Gen-AX Corp. All Rights Reserved. 14 なぜRustを選んだのか︖ ② 関数型的アプローチを取り⼊れて質の⾼いコードを⽬指す
A) 型の表現⼒を⽣かす B) Railway Oriented Programmingによるエラーハンドリング • Option型/Result型がサポートされるか Kotlin Rust Java Kotlin Go Rust
© Gen-AX Corp. All Rights Reserved. 15 なぜRustを選んだのか︖ • 技術選定⽅針以外の観点で⽐較
• プロダクトの特性との親和性 • データ前処理が多い • リバースエンジニアリングのしにくさ • ⼤企業向けにはSaaSではなくパッケージ提供も想定 → どれも決め⼿に⽋ける • 0から開発するタイミングだからこその選択 • エンジニアに愛される⾔語 • 最悪、ダメなら別の⾔語に変更も視野に⼊れて選択 最終的には、よりチャレンジングな⾔語(Rust)を選定
© Gen-AX Corp. All Rights Reserved. 16 型の表現⼒ • Newtypeパターンによる型安全性向上
• 「中⾝は同じ型」だが「意味論的に異なる型」を定義、引数不⼀致などをコンパイラで検知 • (例)各種ID、⼀部のIDの型はULIDだが、種類によって異なるケース async fn bulk_replace( &self, org_id: &OrgId, model_id: &ModelId, testset_ids: Vec<TestsetId>, user_id: &UserId, revision: Revision, ) -> AppResult<()> { if testset_ids.is_empty() { return Ok(()); } self.repository .bulk_replace(org_id, model_id, testset_ids, user_id, revision) .await?; ・・・
© Gen-AX Corp. All Rights Reserved. 17 型の表現⼒ • Newtypeパターンによる型安全性向上
• 「中⾝は同じ型」だが「意味論的に異なる型」を定義、引数不⼀致などをコンパイラで検知 • (例)各種ID、⼀部のIDの型はULIDだが、種類によって異なるケース async fn bulk_replace( &self, org_id: &OrgId, model_id: &ModelId, testset_ids: Vec<TestsetId>, user_id: &UserId, revision: Revision, ) -> AppResult<()> { if testset_ids.is_empty() { return Ok(()); } self.repository .bulk_replace(org_id, model_id, testset_ids, user_id, revision) .await?; ・・・ pub struct ModelId(ulid::Ulid); pub struct TestsetId(ulid::Ulid);
© Gen-AX Corp. All Rights Reserved. 18 Railway Oriented Programming(ROP)
• 成功時の結果とエラーの両⽅を扱える”Result型”を関数の戻り値にする書き⽅で、処理 のパイプラインを構築するという設計⼿法 → Rustのエラーハンドリング設計⽅針に合致 • 特に、エラーが発⽣したらエラーを呼び出し元に返す実装は、”?”(question mark operator)で簡潔に書ける tx, err := db.Beginx() if err != nil { return nil, err } _, err = tx.NamedExec(“INSERT INTO person・・・ “) if err != nil { return nil, err } ・・・ (例) Transaction実装 let mut tx = db.begin().await?; sqlx::query!(”INSERT INTO person・・・”, ・・・) .execute(&mut tx) .await?; ・・・ Go Rust 対応
© Gen-AX Corp. All Rights Reserved. 19 Railway Oriented Programming(ROP)
(Rustだからの問題ではないが) • ROPを採⽤しても以下の考慮は必要 • エラーを返すべきなのか、異常終了させるべきなのか • Rustでは以下を推奨 • 回復可能なエラー → Resultで返す • 回復不可能なエラー → panic!(unwrap, expect)を呼び出す※ ※axumでは、panic!を呼び出しても異常終了せず、500エラーが返る • エラーの種別、粒度をどうするか • エラー種別を細かくしすぎても、”エラー定義地獄” • 細かくハンドリングできず、コードの⾒通しが悪くなるだけ • まとめすぎると、情報が⽋落し、デバッグ時に必要な情報が残っていない
© Gen-AX Corp. All Rights Reserved. 20 Rustを採⽤したメリット • コンパイルが通った場合の品質への安⼼感が⾼い
• 他⾔語ではテストコードで担保することが多いが、コンパイルが通ることがある意味テスト • コンパイラーによるエラーハンドリングの抜け漏れ排除 • エラーをenumで定義し、Rustの強⼒なパターンマッチ機構により、バグを排除 • コードの⾒通しが良くなった • if⽂による分岐が減り、ハッピーパスの⾒通しがよくなった • Rust固有のSyntaxのおかげ • 独⾃型の導⼊の敷居が低く、関数宣⾔である程度実装の意図も残せる • トレイトにより、独⾃型も、簡単にPrimitive型と同じような演算が定義できる • 独⾃型の導⼊が進むと、関数宣⾔で、実装の意図も残せる
© Gen-AX Corp. All Rights Reserved. 21 Rustの⾟み • 使い⽅やサンプルコードの情報が少ない
• Docsを⾒ても説明が少なく、サンプルコードもほとんどない • 直接実装コードを⾒て確認 • ChatGPT(o3-miniなど)に聞いても、ハルシネーションが起きやすい • CrateのVersion upで破壊的変更が⼊ることも多い • 多くのcrateが1.0未満のVersionも多く、安定していないことが起因 • 今後、時間が経てば解決する問題 • ビルド、lintに多くのリソースを消費する • rust-analyzerや、ビルド時にメモリも多く消費 • rust-analyzerも3GB程度消費、 • ビルド時間も結構かかる(依存するcrateが多いとコンパイル対象が多く時間がかかる)
© Gen-AX Corp. All Rights Reserved. 22 今後の課題 • 依存crateの⾒直し
• crateのVersion Upで破壊的変更が⼊るものあるので、適宜Upgradeも対応していく • Feature設定の⾒直し、依存crateが少ないものに変更 • azure core/azure storage/azure storage blobsなど • データ処理実装の最適化 • サービスリリース初期は、データ量も多くはないので、機能実装を優先 • 今後、データ量が増えたとき、効率的なデータ処理が必要 • 処理速度だけでなく、メモリ使⽤量も考慮した最適化 • CI時間の短縮 • ⾼速リンカー(mold)への変更 • ビルドキャッシュの⾒直しなど
© Gen-AX Corp. All Rights Reserved. 23 エンジニアを募集しています • ⽣成AI照会業務⽀援プロダクト(X-Boost)
• 機能改善・新機能開発 • RAGの精度改善 • データ処理実装の最適化 • 外部CRM連携 など • ⾃律思考型AIの⾳声応対プロダクト • 新規開発 • 電話・⾳声処理(PBX連携、⾳声ストリームの取り回しなど) • 管理・モニタリング機能 • お客様毎の業務カスタマイズ機能 • プロダクトを作って価値提供していきたいエンジニアを募集中︕ • Rust⾃体は未経験でも問題ありません