Slide 1

Slide 1 text

⽣成AIを活⽤した Zennの取り組み事例 Igarashi Ryosuke 新規事業統括部 Zennチーム

Slide 2

Slide 2 text

⾃⼰紹介 2 Igarashi Ryosuke ● 2015年 ⼊社 ○ バックエンドエンジニア ● 2021年 から Zennチーム ○ Next.js / Ruby on Rails / Google Cloud

Slide 3

Slide 3 text

Zennで⽣成AIを活⽤した主な取り組み 3 ● 記事のAIレビュー機能 ● 記事のレコメンド機能 ← 今⽇はこれのお話 ● コンテンツのスパムチェック ● ⾃然⾔語でのDB問い合わせ

Slide 4

Slide 4 text

Zennで⽣成AIを活⽤した主な取り組み 4 その他は、現在開催中の "Zennfes 2025" の動画で紹介しています。 https://zenn.dev/events/zennfes-2025

Slide 5

Slide 5 text

⽣成AIを活⽤した 記事のレコメンド機能

Slide 6

Slide 6 text

レコメンド機能に取り組む背景 6 ● トップページのトレンド(Trending)が偏りがち ○ Web開発系の記事に⼈気が集まる傾向 ○ 少し前までは⽣成AI/AI駆動開発など⼀⾊に ○ 良くも悪くもトレンドを反映 ● 読者に読みたいコンテンツを届けるのはコンテンツ投 稿サイトの使命 → 機械学習を使わず、⽣成AIを使ってパーソナライズされ たレコメンドを!

Slide 7

Slide 7 text

やったこと 7 ● phase 1. 6次元ベクトルによる類似検索(βリリース) ● phase 2. Embeddingsによる類似検索(検証のみ) ● phase 3. トピックベースの類似検索(現在)

Slide 8

Slide 8 text

phase 1 6次元ベクトルによる類似検索(βリリース)

Slide 9

Slide 9 text

作戦 9 ● トレンドと同じ期間(おおよそ公開から1週間)の記事を推薦する ○ 記事の総数が少ないためピンポイントな推薦は難しい ○ ざっくりとした6つのカテゴリー分類での推薦を⽬指す ● 記事の内容を⽣成AIに読み込ませて特徴を数値化 ○ 6つのカテゴリーそれぞれに対する関連度を、6次元ベクトルで表現 ● ユーザーが興味を⽰した記事のベクトルからユーザーの興味ベクトル計算 ● 記事とユーザーのベクトル類似検索でレコメンド記事を提供

Slide 10

Slide 10 text

詳細 10 ①生成AIにより記事の特徴を 数値化(ベクトル化) ②ユーザーが興味を示した記事のベクトル を集計して、ユーザーの興味を数値化(ベク トル化) ③ベクトルが近い記 事を抽出 【記事の特徴ベクトル】 【ユーザーの興味ベクトル】

Slide 11

Slide 11 text

プロンプト 11 ←ここに記事の本⽂が⼊る

Slide 12

Slide 12 text

出⼒例 12

Slide 13

Slide 13 text

技術トピック 13 ● ⽣成AIは Vertex AI - Gemini 2.5 Flash を使⽤ ○ レスポンスのフォーマットをJSON Schemaで定義できる ○ 思考(thinking)を有効にすると、深い洞察を⾏う ● ベクトル計算はpgvector(PostgreSQL拡張)を使⽤ ○ vector型フィールド ○ ユークリッド距離、コサイン類似度、内積などの演算 ○ 近似近傍検索⽤のインデックス

Slide 14

Slide 14 text

より詳しくは 14 https://zenn.dev/team_zenn/articles/zenn-recommend-system

Slide 15

Slide 15 text

結果 15 ● ⽣成AIによる特徴抽出は⾼い精度で実現できた。 ● 多くのユーザーが求める"レコメンド"と期待値のズレ ○ ユーザーフィードバックの結果 ■ レコメンデーションの精度向上/関連性の問題(計8件) ■ フィルタリング/パーソナライズ機能の要望(計11件) ■ 表⽰コンテンツの多様性/量(計5件) ■ UI/UXの改善要望(計8件) ■ その他(計2件) ○ ⾒せ⽅の問題もあった

Slide 16

Slide 16 text

phase 2 Embeddingsによる類似検索(検証のみ)

Slide 17

Slide 17 text

作戦 17 ● phase 1の結果、レコメンドの精度に関する期待値ギャップに課題があった。 ● 精度を上げるには6次元のベクトルでは⾜りない。 ○ ベクトルを増やす? ■ いくつあれば⼗分? ■ ベクトル定義の更新のたびに全件更新が必要... ● Embeddingsを使ってより精度の⾼い類似検索を! ● ユーザーの興味ベクトルは作れないので、直近で閲覧した記事に類似する記事 を提案する

Slide 18

Slide 18 text

Embeddingsとは 18 ● 単語、⽂章、画像、⾳声などのデータを数値ベクトルに変換すること。 ● 元のデータの意味や⽂脈を数値空間で表現し、意味的に似ているデータはベ クトル空間上で近くに配置される。 ● セマンティック検索(あいまい検索)、RAGなどに活⽤される。

Slide 19

Slide 19 text

● Embeddingsには Gemini API - gemini-embedding-001 を使⽤ ○ 次元数は最⼤(デフォルト)3072 から 128まで圧縮可能 ■ 今回は768次元で検証 ○ タスクに応じたEmbeddings ■ SEMANTIC_SIMILARITY(テキスト類似度に最適) ■ CLASSIFICATION(ラベルに従ってテキスト分類に最適化) ■ CLUSTERING(テキストをクラスタ化するように最適化) ■ RETRIEVAL_DOCUMENT / RETRIEVAL_QUERY(テキスト検索向けに最適化) ■ など 技術トピック 19

Slide 20

Slide 20 text

出⼒例 20 ● AWS ECS オートスケーリング Cooldownを知った【2025夏】 ↓に類似する記事 ● [類似度: 0.896] AWS ECS オートスケーリングの種類を学びました ● [類似度: 0.838] ECSにAWS Gravitionを導⼊すると何が良いのか調べてみた ● [類似度: 0.817] ECS Fargateのソフトウェア‧アップデート運⽤を考える ● [類似度: 0.803] Amazon ECSのアベイラビリティゾーンリバランシングをCDK で設定する⽅法

Slide 21

Slide 21 text

検証結果 21 ● SEMANTIC_SIMILARITY を使⽤して記事本⽂を10,000件程度ベクトル化 ● 類似検索の傾向 ○ ある程度の⽂量の記事は類似性が⾼い記事が検出しやすい ○ 短い記事やidea記事は微妙 ● 結果のコントロールの難しさを感じた

Slide 22

Slide 22 text

(参考)ハイブリッド検索 ※時間が余ってたら 22 ● Embeddingsは意味や⽂脈の類似性を捉えるが、単語レベルの類似性は弱い ● より精度を⾼めるには、キーワードの類似性も掛け合わせたハイブリッド検 索を使う ● 2種類のベクトル ○ 密なベクトル(意味的、Embeddingsはこっち) ○ 疎なベクトル(キーワード的) ● 2つのベクトルの類似度を合成してランキングを作る

Slide 23

Slide 23 text

(参考)ハイブリッド検索 23 出典: https://cloud.google.com/vertex-ai/docs/vector-search/about-hybrid-search?hl=ja 密なベクトル 疎なベクトル

Slide 24

Slide 24 text

(参考)ハイブリッド検索 24 ● 疎なベクトルの⽣成には、TF-IDF や BM25 のような統計⼿法や、学習済のモ デル(SPLADEなど)を⽤いる。 ● ハイブリッド検索は最近のベクトルDBサービスにはだいたい備わっていそ う。pgvectorでもサポートあり。 ● それぞれのベクトルで類似検索を⾏い、リランキングをする。

Slide 25

Slide 25 text

phase 3 トピックベースの類似検索(現在)

Slide 26

Slide 26 text

作戦 26 ● phase 2 検証時点のチーム内の声 ○ もっと直近の閲覧状況を反映した記事が⾒たい ○ もっと質の⾼い記事が推薦されてほしい ● 閲覧履歴を記録し、直近10件の記事に頻出するトピックを抽出 ● 直近3ヶ⽉以内に公開された記事のうち⼈気度が⾼い記事の中から、トピック の類似度が⾼い記事を抽出 ● ルールベースの推薦

Slide 27

Slide 27 text

お試しください 27

Slide 28

Slide 28 text

課題 28 ● 記事に適切なトピックが設定されているか ● ユーザーの記事に対する興味の測り⽅‧重み付け ● ユーザーの興味がないトピックへのフィードバック

Slide 29

Slide 29 text

まとめ

Slide 30

Slide 30 text

まとめ 30 ● ⽣成AIによって記事のスコアリングは⾼い精度で実現した ● Embeddingsは明確で⼗分な⽂章量があれば⾼い精度でベクトルが類似する ● レコメンドはとても奥が深い ○ やり⽅が無限にある ■ ルールベース、コンテンツベース、協調フィルタリング、など ○ 変数が多すぎる ■ ユーザーの⾏動(ポジティブ‧ネガティブ)、コンテンツ属性、など ○ UI/UXも⼤事 ■ 期待値コントロール、推薦の納得感、など

Slide 31

Slide 31 text

No content