$30 off During Our Annual Pro Sale. View Details »

gokart をどこでどのように 使っているか? / In what situations Sansan uses gokart

gokart をどこでどのように 使っているか? / In what situations Sansan uses gokart

■イベント :【Sansan×エムスリー】gokartで爆速開発!MLOps勉強会
https://sansan.connpass.com/event/288525/

■登壇概要
タイトル:gokart をどこでどのように 使っているか?
発表者: 技術本部 研究開発部 研究員 小松 尚太

◉ 研究開発職 採用情報
募集中のポジションや関連記事など
https://media.sansan-engineering.com/

◉ Sansan Tech Blog
Sansanのものづくりを支えるメンバーのテックブログ(R&Dメンバーの連載も多数)

https://buildersbox.corp-sansan.com/

Sansan R&D

July 12, 2023
Tweet

More Decks by Sansan R&D

Other Decks in Technology

Transcript

  1. Sansan株式会社
    部署 名前
    gokart をどこでどのように
    使っているか?
    Sansan技術本部
    Sansan技術本部
    研究開発部
    小松 尚太

    View Slide

  2. 写真が入ります
    ⼩松 尚太
    Sansan株式会社
    技術本部 研究開発部 SocSciグループ 研究員
    - 農学修士
    - 2020年5月入社
    - 前職はコートジボワールにある国際農業研究機関
    - データを活用した課題解決に従事

    View Slide

  3. gokart を活⽤して、データを⽤いた課題解決を⾏っている話をします。
    - どこで使っているか?
    - どうやって使っているか?
    お話すること
    2

    View Slide

  4. 何をしているか?

    View Slide

  5. 私たちのチームは以下のミッションを掲げている。
    - 営業を強くするDXサービスの付加価値を高める
    - データドリブンな意思決定でプロダクトのグロースをリードする
    - データ活用で社内/プロダクトの課題を解決する
    何を実現したいか?

    View Slide

  6. - Sansan Labs
    - 社内向け application suite「In-house Solutions」
    - A/B Test
    これらすべてで gokart を利⽤している。
    ミッション実現のために何をしているか?

    View Slide

  7. Sansan Labs

    View Slide

  8. 解決策
    - ユーザーからのフィードバックやインタビューを通して
    課題を特定
    - リードタイム1ヶ月程度で高速にリリースできる開発体制
    - リリース後もフィードバックを受けて機能改善
    結果
    - 2022/7~12で10個の新機能をリリース
    - 営業生産性の向上に貢献
    Sansan Labs
    営業DXサービス「Sansan」において、データドリブン
    に営業のターゲティングやアプローチ⽅法を実現する
    ビジネス課題
    営業ポテンシャル分析
    業界ニュースランキング
    営業アクティビティレポート
    役職者接点カバー率
    訪問ルートメーカー
    類似企業検索
    企業パフォーマンス検索
    企業リレーションスコア

    View Slide

  9. 社内向け application suite
    「In-house Solutions」

    View Slide

  10. - 社内の課題を高速で解決するために、Sansan Labs のテンプレートをベ
    ースに誕生
    - 社内課題の例
    - 顧客のセグメントをいろんなカットで見られると嬉しい
    - 問い合わせ対応を自動化したい
    - 利用状況のレポートを簡単に作成できるようにしたい
    - 荷電のメモ作成を自動化したい
    - …
    In-house Solutions

    View Slide

  11. 例: 利⽤状況レポートの⾃動化で業務⽀援
    ※レポートイメージ

    View Slide

  12. A/B Test

    View Slide

  13. 解決策
    A/B テストで複数の訴求メッセージの中から
    効果的なものを特定
    結果
    - 目標値を上回る利用実績を実現
    - 利用訴求メッセージの違いを定量的に判断でき、
    カスタマーサクセスのメッセージ作成にも
    知見が蓄積された
    モバイルアプリ内での効果的な利⽤訴求メッセージの特定
    商談前に、つながりを検索。
    相⼿と同僚との接点を確認しよう
    スマホで⼈脈をサクサク検索。
    商談相⼿とのつながりを事前に把
    握しよう
    A案
    B案
    Sansanモバイルアプリ上で
    特定の機能を使⽤したことがないユーザーに対し、
    効果的に利⽤促進するメッセージを特定する
    ビジネス課題

    View Slide

  14. なぜ gokart を使うか?

    View Slide

  15. きっかけ
    将来、他のフレームワークを使うことになる可能性もあるが、
    「フレームワークに載っているものを別のフレームワークに移す」ことは、
    「何もフレームワークに載っていないものをフレームワークに載せる」こと
    よりも格段に容易

    View Slide

  16. - 開発や運用の属人性を排除
    - batch のベースを gokart に統一することで、ノウハウの蓄積が進む
    - 開発リードタイムの削減
    - 高速な実装が可能になりつつある
    gokart に統⼀することの効果

    View Slide

  17. Sansan Labs の開発のリードタイムは半分になった
    → さらに半分にする
    リードタイム:最も古い Pull Request の作成日から、最新の Pull Request がマージされた日までの日数
    平均 66.3日
    平均 35.3⽇

    View Slide

  18. どうやって gokart を使っているか?

    View Slide

  19. テンプレートからプロジェクトを作成
    - Cookiecutter を使ってプロジェクトを作成
    - batch にて gokart を使用し、データ取得・加工・アップロードを行う
    .
    ├── app ... frontend code base
    ├── batch ... batch code base
    ├── .env.example
    ├── mypy.ini
    ├── compose.yaml
    └── README.md

    View Slide

  20. .
    └── batch
    ├── conf
    │ ├── logging.ini
    │ └── param.ini ... parameters for batch pipelines
    └── pipeline
    ├── schemas
    │ ├── data_schema.py ... pandas schemas
    │ └── __init__.py
    └── tasks
    ├── data_loader.py ... load data from public clouds
    ├── data_handler.py ... handle data
    ├── data_uploader.py ... upload data
    ├── __init__.py
    └── main_task.py ... main task
    batch のディレクトリ構造の⼀部
    - tasks 以下に gokart task を定義していく
    - data_loader, data_handler, data_uploader で定義した task を、main_task で実行す
    る。

    View Slide

  21. task の例
    class SliceDataTask(GokartTask):
    """
    データを上から100行までスライスするタスク
    """
    raw_data_task = gokart.TaskInstanceParameter()
    def run(self) -> None:
    df = self.load_data_frame()
    processed_df = self.run_imp(df)
    self.dump(processed_df)
    @classmethod
    @pa.check_types
    def run_imp(
    cls, df: DataFrame[data_schema.RawDataOutputSchema]
    ) -> DataFrame[data_schema.SliceDataOutputSchema]:
    return df.head(100)

    View Slide

  22. - JSON ファイルに A/B テストの設定を
    記述
    - JSONファイルのパスをパラメータとし
    てタスクに渡す
    - JSON ファイルごとにデータ処理タス
    クが走り、最後にデータが統合される
    A/B Testの実⾏
    {
    "promoted_feature_name": "xxxxx",
    "query_path": "./sql/hoge.sql",
    "begin_date": "2023-02-01",
    "abtest": {
    "enabled": true,
    "uuid": "xxxxx",
    "description": "hogehoge",
    "sample_size_per_variant": 2000,
    "variants": [
    {
    "group_name": "A",
    "description": "Plan A",
    "content_id": "xxxxx"
    },
    {
    "group_name": "B",
    "description": "Plan B",
    "content_id": "xxxxx"
    },
    {
    "group_name": "C",
    "description": "Control Group",
    "content_id": null
    }
    ]
    }
    }

    View Slide

  23. - 課題解決を素早く行うために gokart に統一して活用している。
    - オーソドックスに gokart を使っていると思うが、さらに活用すべき機能
    があるかもしれない。
    終わりに

    View Slide

  24. View Slide