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
37
【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
7.2k
【Gen-AX】20250514開催_Findyオンラインイベント_技術選定を突き詰める
genax
0
2.2k
【Gen-AX】Gen-AX株式会社_カンパニーデック
genax
0
1.1k
Other Decks in Technology
See All in Technology
S3アクセス制御の設計ポイント
tommy0124
3
220
「その開発、認知負荷高すぎませんか?」Platform Engineeringで始める開発者体験カイゼン術
sansantech
PRO
2
1.2k
Android Audio: Beyond Winning On It
atsushieno
0
5.6k
Create Ruby native extension gem with Go
sue445
0
180
【NoMapsTECH 2025】AI Edge Computing Workshop
akit37
0
460
AIエージェントで90秒の広告動画を制作!台本・音声・映像・編集をつなぐAWS最新アーキテクチャの実践
nasuvitz
3
440
Bedrock で検索エージェントを再現しようとした話
ny7760
3
170
Aurora DSQLはサーバーレスアーキテクチャの常識を変えるのか
iwatatomoya
1
1.2k
Rustから学ぶ 非同期処理の仕組み
skanehira
1
160
はじめてのOSS開発からみえたGo言語の強み
shibukazu
4
1.1k
未経験者・初心者に贈る!40分でわかるAndroidアプリ開発の今と大事なポイント
operando
6
860
バイブスに「型」を!Kent Beckに学ぶ、AI時代のテスト駆動開発
amixedcolor
3
600
Featured
See All Featured
Building a Modern Day E-commerce SEO Strategy
aleyda
43
7.6k
How to Think Like a Performance Engineer
csswizardry
26
1.9k
How STYLIGHT went responsive
nonsquared
100
5.8k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
113
20k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
139
34k
Designing for humans not robots
tammielis
253
25k
Making Projects Easy
brettharned
117
6.4k
Unsuck your backbone
ammeep
671
58k
Building Flexible Design Systems
yeseniaperezcruz
329
39k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
188
55k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.6k
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⾃体は未経験でも問題ありません