TECH PLAY

株式会社ユーザベース

株式会社ユーザベース の技術ブログ

504

はじめに 私たちのプロダクトチームでは、AI Agentの開発にGoogle ADK (Agent Development Kit)を利用しています。 過去に開発したエージェントを段階的に成長させる形でバージョンアップを行っていますが、その過程で少しニッチなエラーに遭遇し、デプロイがブロックされる事象が発生しました。 今回は、その原因と解決策について備忘録を兼ねてまとめます。 起きた問題:アップデート後にSmoke Testが404エラーで落ちる 私たちは Argo Rollouts を利用してデプロイを行っており、AnalysisTemplate を用いたスモークテストを自動実行しています。…
はじめに Dart で == を使ったとき、「同じ値なのに false になる」という経験はないでしょうか。 この記事を書こうと思ったきっかけは、LinkedHashMap を Equatable パッケージで等価比較しようとしたときの出来事でした。LinkedHashMap は挿入順序を保持するデータ構造なので、当然順序も含めて比較してくれるだろうと思っていたのですが、実際には順序が無視されて等しいと判定されてしまいました。なぜこうなるのかを調べていくうちに、Dart の等価性の仕組み全体に興味を持ち、さまざまなデータ構造について網羅的に検証してみることにしました。 本記事では、クラス・コレ…
はじめに こんにちは。株式会社ユーザベース Speeda事業でソフトウェアエンジニアをしている朝比奈です。 私は現在、データフィードチームに所属しており、主な言語としてGroovyを扱っています。その際にエルビス演算子を用いてプログラムを書き、個人的な学びがあったのでブログを執筆することにしました。 エルビス演算子とは そもそもエルビス演算子ってなに?という方向けにエルビス演算子について軽く説明します。 エルビス演算子 a ?: b は、「左側の評価結果が『使える値』であればそのまま使い、そうでなければ右側の値にフォールバックする」ための演算子です。 下記はKotlinでの実装例です。 fug…
はじめに 開発の中で「例外処理」を実装しなければならないタイミングは、定期的に訪れます。 しかし私は、例外をどのように扱うべきかで度々迷ってしまいます。そして、そのたびにコードを書く手を止めて悩んでいました。 思えば、エンジニアなら誰もが日常的に書いているはずの「例外処理」ですが、なぜかチームを超えて共通化されたベストプラクティスのようなものを見かける機会が少ないように感じます。 そこで今回は、自分なりに調べて辿り着いた「例外の取り扱いに関する、現時点での解」をまとめてみます。 その例外は本当に例外か 私たちが遭遇する「例外」をじっくり分解してみると、大きく2つの性質に分かれていることに気づき…
はじめに 株式会社ユーザベース スピーダ事業 竹澤です。 みなさんは、チーム内外のコミュニケーションを増やしたいと思った経験はありませんか? オフィスに出社しているとオンラインで働いているときよりは偶発的な会話が生まれやすいです。 一方で、出社していても同じチームのメンバーなど特定の人との会話に偏りがちだと感じています。 すでに親しい人と仲良くすることも大事です。しかし、あまりコミュニケーションを取ったことがない人と話すことで、その人の得意な分野などがわかり、質問に行きやすくなります。 コミュニケーションを増やす手段として、「おやつ神社1」がよく挙げられます(お菓子神社と呼ばれることもあるよう…
株式会社ユーザベース スピーダ事業 機械学習エンジニアの二木です。 2026年6月8日(月)〜12日(金)にGメッセ群馬で開催される、第40回人工知能学会全国大会にゴールドスポンサーとして協賛しています。 conf.ai-gakkai.or.jp JSAI2026にスポンサーブース出展 ユーザベースの取り組み(一部) 🎓 学生の方へ | インターンイベント開催! Speeda 機械学習エンジニア サマーインターン Speeda ソフトウェアエンジニア 1day インターン JSAI2026にスポンサーブース出展 ドリンクコーナー近くの121にスポンサーブースがあります。 ブースにはユーザベース…
はじめに どんなプロジェクトだったか? プロジェクトのゴール チーム構成 取り組んだこと 口頭によるコミュニケーションを大事にする リプレースできる条件を定義する ログインに関連するイベントを洗い出す パスワードが更新されたとき 同一人物が複数アカウントを使い分けている際のログイン体験を考慮 契約プランの変更オペレーションへの対応 一部ログイン手段の廃止 少しずつ不確実性を下げる 頻繁にリリースする 実装できていなくても想像してみる テスタビリティの高い実装にリファクタリングする Clean Architecture を意識した設計 Usecase の実装 Presenter の実装 補足 画…
はじめに プロジェクトセリングチームではAIを活用したプロダクトを開発しており、その中でIR資料を生成AIで処理して活用しています。 繁忙期に向けて資料の提出が増える時期になったので、これまで日次で行っていた手作業の運用ではなく、DBの更新があった際にリアルタイムに資料を生成AIで処理する仕組み(CDC)を作る中で問題が起きたのでまとめます。 発生したこと 資料格納DBへのデータインサートをトリガーにPub/Subにメッセージを送り、サブスクリプションから要約処理を受け持つハブAPIを呼び出す構成になっていました。 ハブAPIの中では、データを処理するためにPOSTリクエストでコアとなる生成A…
はじめに こんにちは。株式会社ユーザベース Speeda事業の伊藤、田中、都築、濱岡です。 私たちは現在、Speeda AI Agent の開発に携わっています。本記事では、その中の「組織図」を表示する機能を開発する過程で、データ構造を「Tree」から「DAG(有向非巡回グラフ)」に捉え直した話を共有します。 組織図機能について Speeda AI Agent では、企業分析を進めるためのワークフローをいくつか提供しています。その中の一つが「重要人物を特定する」というワークフローです。 このワークフローでは、対象企業の組織構造と、その中の重要人物を関連付けて把握することができます。その中で公表…
はじめに DPOを利用する上での前準備 選好データセットの準備 参照モデルを準備する DPOの損失関数 どういう時にDPOを使うのが良いのか? DPOの良い面 感情制御とスタイルの高い忠実度 事実に関する正確性と堅牢性 安全性と有害コンテンツの抑制 DPOの課題 冗長性を増大させる傾向がある 多様性が失われる(Diversity Collapse) 数学・コード生成における不安定性 DPOのunslothによる実装方法 まとめ 参考文献 🎓 学生の方へ | 1day インターンイベント開催! はじめに 株式会社ユーザベース スピーダ事業のMLEチームです。今回は今更ながらDPO(Direct …
はじめに 企業レポートの生成を行うエージェントの作成を行う中で、レポート生成にかかる時間・費用・レポートの質の改善に取り組みました。 改善点を行う中で、Stateやプロンプトキャッシュ周りのAgent Platform(旧VertexAI)の仕様について深く知ることができたので記事にしています。 改善前の状況 企業レポートの作成を行うエージェントは以下のような流れで動いていました。 成果物はレスポンスに込め、次のエージェントにコンテキストとして渡し、エージェントは与えられたコンテキストとプロンプトを元に生成を行います。 レポートの質を高めるため、「執筆」→「レビュー」→「編集」を行うエージェン…
はじめに こんにちは。株式会社ユーザベースの石井です。 gemini-3-pro-image-preview の呼び出しに対して 429 Too Many Requests が返ってくる事象に遭遇しました。 問い合わせを通じてVertexAIのスループットの上限まわりの仕様の理解が深まったため記事にしております。 背景:Speeda AI Agent と「アカウントプランを作成する β版」機能 私たちが開発している 「Speeda AI Agent」のワークフローのひとつに「アカウントプランを作成する β版」という機能があります。これは、各種開示資料の要約や課題の情報をベースに、商材の提案資料…
自己株式数・発行済株式数・取引不在の現実に向き合った数ヶ月 こんにちは。株式会社ユーザベースの相川です。 この数ヶ月、自己株式数の取得・登録と、時価総額の算出ロジックに取り組んできました。 振り返ると、やっていたのは機能追加というより、市場データの複雑さを、壊れない業務ルールに翻訳する作業でした。 時価総額の式はシンプルです。 時価総額 = (発行済株式数 - 自己株式数) × 株価 ただし実務では、この3要素が同じ時間軸で揃っていることはほとんどありません。 この「式の単純さ」と「データの複雑さ」のギャップが、実装の本質的な難しさでした。 取引がない期間が、時価総額計算を難しくする 新興市場…
こんにちは。ユーザベースの細田と申します。 私は2025年にユーザベースに入社して以来、インサイドセールス(IS)としてエンタープライズ企業様をはじめとしたさまざまな企業様の深耕や開拓に従事しております。 この記事では、私がISとして取り組んでいる生成AIを活用した業務変革や、私がなぜこれほどまでに生成AIに情熱を注いでいるのか、その想いについてお話しできればと思います。 AIが単なる業務効率化に留まらず、いかにして顧客への価値提供のあり方や私たちの働き方、そして生き方を変革しうるのかをご紹介できれば幸いです。 なぜ今、インサイドセールスに生成AIが必要なのか? ISという仕事は一見シンプルに…
はじめに 株式会社ユーザベース スピーダ事業 竹澤です。 この記事の内容としては、本番稼働中のAPIを止めずに、APIが参照しているDBにNOT NULL制約のあるカラムを追加する1つの方法の紹介です。 私はさまざまなSPEEDAのマイクロサービスから財務値を取得できるような、コアな財務APIの開発に携わっていました。 当初の設計では変則決算を考慮していなかったのですが、開発を進めていくうちに変則決算も必要になりました。 アプリケーションの構成 まずは、ここでこの財務APIの構成を紹介します。 本記事で不要な部分に関しては、省略しています。 ユーザーがAPIを叩くと、アプリケーションは財務AP…
はじめに こんにちは。株式会社ユーザベース Speeda事業の佐藤、小原、阿波連、長岡です。 *1 2026/04/14にGAされた Salesforce Hosted MCP Servers について、スクラッチ環境への接続で一部ハマりどころがありました。 本記事では、接続方法、接続トラブルの原因とその具体的な回避策について、備忘録を兼ねて共有します。 はじめに 手順 遭遇したエラーとその回避策 MCPサーバーでできること おわりに 参考文献 🎓 学生の方へ | 1day インターンイベント開催! 手順 Cursorからスクラッチ組織のMCPサーバーに接続していきます。 スクラッチ組織の作成…
こんにちは。株式会社ユーザベースの相川と申します。 今回は分散システムにおいて、一見関係のない「DBエラー」が「ファイルディスクリプタの枯渇」を引き起こし、最終的にバッチ処理全体に波及したケースがあったので、その内容をお話しします。 本記事では、実際に発生した障害事例をベースに、Java/KotlinアプリケーションでHTTPクライアントを扱う際の注意点と、コネクション管理の重要性について解説します。 1. 発生した事象 マイクロサービス構成において、以下の連鎖的な障害が発生しました。 最背後のDBエラー: Service-C のDBで外部キー制約エラーが発生し、レスポンスが遅延・エラー化。 …
はじめに こんにちは。Speeda Product Teamの板倉です。 AIエージェントに「直近3年の売上推移を教えて」と聞いたとき、こんな回答が返ってきた経験はないでしょうか。 2022年の売上は120億円で、前年比+8%の成長でした。 2023年は135億円で前年比+12.5%、2024年は128億円で前年比-5.2%となっています。 2023年に大きく伸びた要因としては…(以下、長文が続く) 数字の羅列をテキストで読まされても、傾向はすぐには掴めません。これがテーブルやチャートで返ってきたら、一目で把握できるはずです。あるいは「条件を絞り込みたい」と思っても、テキストの往復で一つずつ指…
はじめに みなさんこんにちは、株式会社ユーザベース エキスパートプロダクト開発チームの佐藤一徹です。 私たちのチームでは、 Speedaのエキスパート事業を支えるプロダクト群を開発しており、そのうちの一つとして社員がエキスパートを管理するための社内ツールを運用しています。 本記事では、Next.jsのServer Actionにおけるversion skew問題に対して、 Kubernetes + Istioのルーティングで「クライアントと同じバージョンのサーバーにリクエストをルーティングする」仕組みを実装した話を共有します! 問題 最近、ビジネスサイドの方からこんな問い合わせがありました。 …
speakerdeck.com SOLID原則の中でも最もイメージしづらいとされるLSPですが、実は「オープン・クローズドの原則(拡張に対して開き、修正に対して閉じる)」を守る上で、オブジェクト指向において非常に重要な概念です。 1. LSPの核心は「振る舞いの契約」 LSPを一言で表すと「サブタイプ(子)はスーパータイプ(親)の振る舞いの約束を破ってはならない」という契約です。 静的型付け言語のコンパイラは「型」が合っているかは見てくれますが、「振る舞い」が守られているかまではチェックしてくれません。そのため、これはコンパイラではなく人間が意識して守るべき契約となります。 2. 陥りがちなア…