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
6
【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
190
Other Decks in Technology
See All in Technology
Новые мапы в Go. Вова Марунин, Clatch, МТС
lamodatech
0
1.9k
コスト最適重視でAurora PostgreSQLのログ分析基盤を作ってみた #jawsug_tokyo
non97
2
890
グループ ポリシー再確認 (2)
murachiakira
0
230
ここはMCPの夜明けまえ
nwiizo
32
13k
OPENLOGI Company Profile for engineer
hr01
1
26k
10ヶ月かけてstyled-components v4からv5にアップデートした話
uhyo
5
460
Terraform にコントリビュートしていたら Azure のコストをやらかした話 / How I Messed Up Azure Costs While Contributing to Terraform
nnstt1
1
260
Simplify! 10 ways to reduce complexity in software development
ufried
1
230
勝手に!深堀り!Cloud Run worker pools / Deep dive Cloud Run worker pools
iselegant
4
650
白金鉱業Meetup_Vol.18_生成AIはデータサイエンティストを代替するのか?
brainpadpr
4
240
Oracle Cloud Infrastructure:2025年4月度サービス・アップデート
oracle4engineer
PRO
0
380
DjangoCon Europe 2025 Keynote - Django for Data Science
wsvincent
0
500
Featured
See All Featured
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
45
7.2k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
137
33k
Why Our Code Smells
bkeepers
PRO
336
57k
The Invisible Side of Design
smashingmag
299
50k
Thoughts on Productivity
jonyablonski
69
4.6k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
357
30k
Statistics for Hackers
jakevdp
798
220k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.3k
Building Applications with DynamoDB
mza
94
6.4k
Done Done
chrislema
184
16k
What's in a price? How to price your products and services
michaelherold
245
12k
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⾃体は未経験でも問題ありません