53.8K Views
June 14, 25
スライド概要
デジタル民主主義2030が開発するOSSである広聴AIの技術解説です。
意見可視化・分析システムを、どのようにして、LLMを活用して構築しているのかの技術資料です。
広聴AIの開発に携わる人及び、利用する人に中身の概要を知ってもらいたく作成しました
https://dd2030.org/kouchou-ai
高機能雑用
1 広聴AI技術解説 ブロードリスニングを支える技術 2025/06 ところてん https://x.com/tokoroten
2 広聴AIとは? • 「デジタル民主主義2030」が OSSで開発する、意見可視化・ブ ロードリスニングサービス • 意見を分類・可視化し、市民や行 政、政治家が、議論・意思決定を する際に、有用なインサイトを素 早く提供する • 意見の量ではなく、少数意見を含 めた意見の多様性を可視化する • 原型となったTalk to the cityは 安野たかひろが2024年の東京都 知事選挙で利用したほか、東京都 が「2050東京戦略(案)」の策 定で活用中 https://dd2030.org/kouchou-ai
3 この資料のゴール • デジタル民主主義2030が開発する、ブ ロードリスニングツールである広聴AIにつ いて、裏側の技術を技術者の目線で解説す る • 現状の広聴AIに使われている技術が極めて 広汎であるため、データサイエンスの素養 がないと理解できないものになっている • そのため、普通のプログラマーのオンボー ディングが困難であり、そのギャップを埋 めることをこの資料のゴールとする • 加えて、広聴AIはTTTC(Talk to the city)というソフトウェアをベースとして いるが、なぜフォークして独自開発を行っ ているのか、という文脈を共有する https://dd2030.org/kouchou-ai
4 この資料の技術水準 • 機械学習の中身や学習には深入りしません • ある機械学習アルゴリズムが、何をインプットして、どのようなアウ トプットが行われて、何に使えるのか、という水準で書かれています • 普通のプログラマーが、機械学習をブラックボックスとしつつもいい 感じに使えるようになる、というのが技術水準です • ウェブ周りは、フロントサーバ、アプリサーバ、DB(ファイル) の3層構造で一般的な構成なので割愛 • この資料を読めば、2時間で広聴AIの コアアルゴリズムのクローンを作成できます • コードがある箇所はパワーポイントのノート欄にコードが書い てあります
5 目次 • 基礎技術解説 • 文字、トークナイズ、単語ベクトル、文脈ベクトル • LLM、InstructionTuning、Structured Output • クラスタリング、次元圧縮 • 広聴AI技術解説 • TTTCと広聴AIの関係性 • 広聴AIの処理の流れ
6 目次 • 基礎技術解説 • 文字、トークナイズ、単語ベクトル、文脈ベクトル • LLM、InstructionTuning、Structured Output • クラスタリング、次元圧縮 • 広聴AI技術解説 • TTTCと広聴AIの関係性 • 広聴AIの処理の流れ
7 文字とは数値 • コンピュータの中では文字は数値として取り扱われる • JavaScriptで確認 • Pythonで確認
8 「猫」と「ねこ」 • 人間は「猫」と「ねこ」を同 一のものと認識する • コンピュータにとってこれら は全くの別モノ(別の数値) に見える • どのようにすると、コン ピュータは「猫」と「ねこ」 を同じだと思って取り扱える ようになるだろうか? • 0xE78CAB と 0xE381ADE38193 は似てい るのだろうか?
9 シノニム(同義語)辞書の整備 • 日本語では、漢字の開き、ひらがな、カタカナくらいは機械的に変 換ができる • それ以上は、対応表(シノニム辞書)を根性で整備する必要 • 「パソコン」「PC」 • 「自動車」「車」「クルマ」「カー」 • 「携帯電話」「スマートフォン」「スマホ」 • 「エアコン」「クーラー」 • 「ヨドバシカメラ」 「ヨドバシ」「ヨド」 • 「任天堂」「京都の花札屋」 • 「顧客」「クライアント」「カスタマー」 • 「利益」「黒字」 • 昔の検索エンジンはシノニム辞書の整備を頑張っていたが、 さすがに人間がやるには限界があるので、機械に任せたくなる
10 word2vec(2013) • 簡単に言うと「同じような前後文脈で使われ方をしている単語は、 同じような意味なのだろう」という考え方に基づくアルゴリズム • 標準実装では、対象の単語の前後5ワードを利用する • 英語はワード単位で切れるが、日本語では形態素解析が必要(後述) • 「カワイイ○○が『にゃー』と鳴いた」 • ○○には「猫」や「ねこ」が入りうる • 「猫」と「ねこ」は同じそうだなと分かる • 「子供の△△はとてもカワイイ」 • △△には「猫」だけでなく「犬」や「鶏」なども入りうる • 「猫」「犬」「鶏」は近そうだなと分かる
11 トークナイズ、形態素解析 • 人は単語単位で意味を処理するので、意味単位に切り出してコン ピュータで取り扱ったほうが効率的 • 英語ではスペースで単語が区切られているので、その単位で取り扱 えばよい • 日本語では形態素解析を行って、単語単位で切り出すことが多い • 形態素解析に関しては割愛
12 word2vecによるベクトル化(分散表現) • 単語の「同じ」や「近しい」を表現するにはどうしたらいいか? • 単語を多次元上の点だと考え、その点の間の距離を考える • 同じような使われ方をしている単語は、近しい位置になるように自 動調整する ・tokyo ・埼玉 ・東京 ・名古屋 ・千葉 ・博多 ・九州 ・犬 ・猫 ・ねこ ・cat ・kitten ・鶏 ・ひよこ X,Yの二次元で模式的に表して いるが、実際には数百次元
13 ベクトル化された中身を見てみる • word2vecのあるモデ ルを使うと「猫」とい う単語が300次元のベ クトルに変換された • ベクトル化することで、 文字列の完全一致でな くとも、コンピュータ はうまく取り扱えるよ うになった
14 ベクトルから近しい単語を探す • 「猫」に近い単語を計算することが可 能になった • 「意味」を理解していることにだいぶ近 づいてきた • 実際にはコサイン類似度というアルゴリ ズムで、二つのベクトル間の類似性を計 算 • 単語をベクトル表現(分散表現)に変 換することで、数学の世界に持ってく ることが可能になった • 「意味の類似性を考える」ということを、 「幾何学の問題」に変換することができ た • 「パソコン」と入れた際に「PC」が含 まれる文章を検索するような、意味レ ベルの曖昧検索が可能になった
15 多次元空間における近いとは何か? • マンハッタン距離(赤線)、説明割愛 • ユークリッド距離(青点線) 、説明割愛 猫 • 角度を利用する、0に近いほど近い ・ねこ • 角度はベクトルの内積の定義から計算できる • A・B = |A| |B| cosθ (高校数学Bの範囲) • cosθ = A・B / |A| |B| • θ=cos-1(A・B / |A| |B| ) • 一般にはコサイン類似度を利用する • 上記式の cosθ = A・B / |A| |B| まで計算する • cosθは似ていれば1に近く、違うなら-1に近く なる • θ=0 °のとき1、θ=180°のとき-1をとる • わざわざcosの逆関数を使って角度を求めなくと も、 cosθを求めるだけで類似性の判断はできる ・東京 θ
16 コサイン類似度を実際に計算してみる • 単語が適切な分散表現に変換 出来れば、意味の近さは内積 の計算で求まる • 分散表現によって言語学の問 題が、空間幾何の問題変換さ れた • 幾何の問題に落ちれば、ベク トル計算≒四則演算に落ちる • 四則演算に落ちれば、コン ピュータで計算できる wrod2vecのsimilarityと、手動で計算した コサイン類似度の値が一致する
17 Word2Vecの限界、単語ベクトルの限界 • 「bank」は文脈によって「川岸・土手」や「銀行」になる • word2vecでは単語単位でしか学習出来てないので、この2つの 文章の"bank"は同じ値になる • 文1: "He sat by the bank of the river." • 文2: "She deposited money in the bank." • 前後文脈によって意味が異なる単語を適切にとらえられていな い • 日本語の「ネコ」も実は多義的 • 土木作業員は「ネコを取ってきてくれ」と言った
18 BERTの登場(2018) • BERTは、ベクトル表現された単語の値を、前後のベクトルと 共に計算を行うことで、その文脈にあった意味を持つ値になる ように変換を行う • 文1: "He sat by the bank of the river." • 文2: "She deposited money in the bank." • 上記の例では、riverやmoneyによってbankの意味が変化してくる • BERTの登場によって、googleでは、自然文による検索の精度 が大きく改善したとされている(2019年頃の話) • また、BERTは文章全体の意味も同時にベクトル化できる • 文章のベクトル化自体は2014年頃から行われていた(doc2vec)が、 性能向上しうまく機能するようになったのはBERT以降
19 BERTは、文脈と単語の意味を計算する [CLS] He sat by the bank of the river. 文章の開始地点に は必ずCLSトーク ンが入れられる 0.7 ... ... ... ... 0.1 ... ... ... ... 0.3 ... ... ... ... 0.2 ... ... ... ... 0.9 ... ... ... ... 0.0 ... ... ... ... 0.2 ... ... ... ... 0.8 ... ... ... ... 0.7 ... ... ... ... 単語のベクトル ニューラルネットワークによる 複雑な相互行列計算 計算後にCLSトー クンの値は、文脈 全体の意味を表現 するベクトルに変 換される 0.9 ... ... ... ... 0.4 ... ... ... ... 0.8 ... ... ... ... 0.7 ... ... ... ... 0.1 ... ... ... ... 0.6 ... ... ... ... 0.2 ... ... ... ... 0.5 ... ... ... ... 0.5 ... ... ... ... BERTによって計算後の 文脈の意味ベクトル
20 文章をベクトル化して計算する • 文章をベクトル化できるようになったので、文章間の遠い、近いも計算できるよう になった、以下の文章をベクトル化してコサイン類似度を観察する • 料理関連 • トマトソースのパスタを作るのが好きです • 私はイタリアンの料理が得意です • スパゲッティカルボナーラは簡単においしく作れます • 天気関連のグループ • 今日は晴れて気持ちがいい天気です • 明日の天気予報では雨が降るようです • 週末は天気が良くなりそうで外出するのに最適です • 技術関連のグループ • 新しいスマートフォンは処理速度が速くなりました • 最新のノートパソコンはバッテリー持ちが良いです • ワイヤレスイヤホンの音質が向上しています
21 文脈ベクトルによる文章の類似度 • ここではSentenceTransformerを用いて、文章をベクトル化 • それぞれの文章間で相互にコサイン類似度を算出してマトリクス化 • 同一ジャンルの文章は、コサイン類似度が高くなっていることが分かる • 同一ジャンル内でも「晴れ」と「雨」ではコサイン類似度は下がる傾向にある • 余談)コサイン類似度は[-1,1]の範囲だが、多次元空間ではほとんどが0 ~1に分布する、詳細は割愛
22 エンベディング(embedding) • 言葉の単語の世界にあるものを、ベクトルの世界に無理やり持っていくこと • 機械学習によって、同じような単語は、高次元空間において近しい位置に配置されるこ と • これにより単語を演算可能なベクトルの空間に変換すること • 日本語化されて「埋め込み」と呼ばれることもある 単語の世界 ベクトルの世界 猫 ネコ 京都 東京 大阪 ねこ
23 エンベディングの実装例 • OpenAI • https://platform.openai.com/doc s/guides/embeddings • APIで利用、text-embedding-3smallでは1536次元のベクトルが 帰ってくる • SentenceTransformers • https://sbert.net/ • Pythonから利用、768次元のベク トルが帰ってくる
24 目次 • 基礎技術解説 • 文字、トークナイズ、単語ベクトル、文脈ベクトル • LLM、InstructionTuning 、Structured Output • クラスタリング、次元圧縮 • 広聴AI技術解説 • TTTCと広聴AIの関係性 • 広聴AIの処理の流れ
25 BERTからGPTへ • BERTは文章を理解する方向性で開発された技術なので、文章生成に適していなかった • GPTは単語の分散表現の列から次の単語を予測する方向に進化、文章生成が可能に He sat by the bank of the ??? 0.1 ... ... ... ... 0.3 ... ... ... ... 0.2 ... ... ... ... 0.9 ... ... ... ... 0.0 ... ... ... ... 0.2 ... ... ... ... 0.8 ... ... ... ... 0.4 ... ... ... ... 0.8 ... ... ... ... 0.7 ... ... ... ... 0.1 ... ... ... ... 0.6 ... ... ... ... 0.2 ... ... ... ... 0.5 ... ... ... ... 自分よりも前の トークンのベクト ルから値を更新 次の単語の確率が得られる
26 GPTは「次の言葉を予測するAI」 • 過去の言葉から、次の言葉を予測する ことは、次の言葉を紡ぐことと同義 • 入力された文章をトークン化 • トークンをベクトル化 • ベクトルを計算して意味ベクトル化 • 次のトークンを予測 • 予測されたトークンから、ランダムに 適当なものを選ぶ • トークンから単語に戻す • 「繋がりそうな単語を繋いでいく」と いう、ただそれだけで、「知性」と 言って差し支えない能力が得られてし まった https://platform.openai.com/playground?mode=complete
27 ChatGPTのトークナイズ • 自然言語はそのままの形ではAIに食わせられな いので、内部的に数値に変換する、この変換が トークナイズ • 出現頻度に応じてトークンの割り当てが行われ ており、英語では頻出単語は1トークンになり、 複雑な単語は途中で分割される • ChatGPTのトークナイザでは日本語の文書は、 1文字が約1.3トークンになる(平易な文章では 1文字1.1トークン程度) • 「日本」「自由」は出現頻度が高いので1トークン にまとめられている • 出現頻度の低い「挙」「孫」「諸」「恵」「禍」 「権」「憲」は1文字が複数のトークンに分割 • 余談)日本語が英語に比べて推論性能が低いの は、英語では「次の単語」を予測するが、日本 語では「次の文字(の一部)」を予測している からではないかという議論もある https://platform.openai.com/tokenizer
28 GPTによる課題解決 • GPT3の頃は、次のような文章で課題解決をしていた https://arxiv.org/abs/2005.14165
29 プロンプトエンジニアリングの誕生 • GPT-3のAPIは2020年9月から提供されていたが、そこまで話題にはな らなかった • 「次の言葉を予測させるための独り言」を入力できる人がはほとんどいなかった • 次の言葉を予測させることで、課題を解決させるには、極めて特殊な構文を発明し なくてはならず、これができる人が限られていた • 一方で、プログラマ界隈では「これは新しいプログラミングの形だ、プロ ンプトエンジニアリングだ」と話題になった • プログラムで課題を解決するのではなく、特殊な穴埋め問題を作ることで、LLMに 埋め込まれた常識を利用して課題を解決することができる • プログラムでなくとも、調整された自然言語で課題解決できるようになった • 事前の機械学習すら不要で、数件の例示だけでかなりの性能を達成 • 言語モデルに埋め込まれた「常識」を利用することで、未知の課題を機械が解ける可能性が見 えてきた • 従来のプログラムが取扱にくかった「不定形な入出力」が行えるようになった
30 ChatGPTは「次の対話を予測するAI」に進化 • Instruction Tuning (対話履歴を学習)によって、自然な応答が可能になった • 発話者という特殊なトークンを導入することで、対話履歴を学習することが可能になり、対話や会 話履歴を通じた問題解決が可能になった • GPTは「次の単語を予測して生成するAI」であった • ChatGPTはそこから発展して「次の対話を予測し、生成するAI」になった • 結果として、一般人が触れるようになり爆発的に普及した • ChatGPTはGPTになかった新しい用途を切り開いた • AIに作業を依頼する、質問に対して回答してくれるツール • 対話をしながら思考を深められるツール • 次の単語を予測するという能力が極まった結果、AGI(汎用人工知能、どんな問題でも 解けるAI)と言っても過言ではない能力を獲得してしまった • データ量と学習量とパラメータを増やせば増やすだけ性能向上することが明らかになった(スケー リング則)ため、AI事業者はAIの高性能化に対してアクセルを踏み込んでいった • https://arxiv.org/abs/2001.08361
31 ChatGPTは何ができそうか? • テキスト生成: 自然言語での文章作成や要約、解説など • 質問応答: 一般的な質問や専門的な質問に対する回答を提供 • プログラミングヘルプ: 簡単なコードのデバッグやプログラミングに関するアド バイス • 言語学習: 言語の文法や単語の説明、例文の提供 • 創作支援: 物語や詩、脚本などの創造的なテキストを生成 • ビジネスコミュニケーション: メールや報告書、プレゼンテーションの草稿作成 • 情報検索: 公開されている情報を基にした質問の回答 • ただし、リアルタイムのウェブ検索は不可 • ゲームと娯楽: 簡単なテキストベースのゲームやジョーク、会話を楽しむ。 • 翻訳補助: 簡単なフレーズや文章の翻訳 • ただし、専門的な翻訳サービスには及ばない • 意見と推論: 与えられた情報に基づき、論理的な推論や意見の形成 • 科学的な根拠や専門的知識に基づいている場合もある
32 ChatGPTは何ができそうか? • 前ページのものは、実はChatGPTの出力結果
33 GPT-4の能力 • 2023年3月、OpenAIはChatGPTにGPT-4を搭載、 ChatGPT Plusで有料提供 • 現在は無償ユーザにもGPT-4を提供 • 現在はGPT-4の上位版の4o、o1、o3なども提供されて いる • GPT-4により、性能が飛躍的向上 • GPT4は司法試験に合格できるくらいのスコアを叩き出 した • 日本の医師国家試験も突破 • https://www.yomiuri.co.jp/science/20230509OYT1T50319/ • 最近はo3で東大入試の理3も突破 • https://toyokeizai.net/articles/-/863722 • 様々な用途への利用が現実的なラインを超えてきた • 東大に入れるAIが月20ドルで使い放題、という状況なの で、これを使いこなすスキルが必要 • さらにはAPI経由で「東大に入れるAI」が誰でもプログ ラムに組み込める状態になった https://openai.com/research/gpt-4
34 余談)用語の包含関係性 コンピュータサイエンス 従来のプログラミング • プログラマーが事前に 全てを定義する • if、変数、配列、ループ で全てを記述する • データをルールで処理 する 機械学習 機械にデータから定義を作らせる 生成AI 人間らしい出力 大規模言語モデル 大規模な言語データから学習 言葉を生成する ChatGPT、Llama等
35 LLMによるプログラミングの拡張 • ColorGPT • ChatGPTのAPIを利用した最初期のアプリ • https://github.com/sonnylazuardi/colorGPT • Webブラウザからカメラを起動し、現実世 界の色のRGBの値から、色の名前に変換す るソフトウェア • #af6e4d → brown • カラーコードと色の対応表を作るのは 骨が折れるが、それをChatGPTを使っ て一撃で処理している https://twitter.com/sonnylazuardi/status/1634 821370423959552
36 ColorGPTの実装を覗いてみる • ChatGPTにロールと例示を与えて、カラーコードを色名に変換 • たったこれだけの指示で、色変換を実現している https://github.com/sonnylazuardi/colorGPT/blob/master/pages/api/color.ts
37 Fewshot learning • LLMにほんの少しの正解となる応答パターンを見せる(受け答えの 履歴を捏造する)ことで、LLMに空気を読ませて、目的となる出力 を行わせる手法 • 特定のフォーマットへの準拠などはこれでうまくいくことが多い https://arxiv.org/abs/2005.14165 英語とフランス語の対訳表を作り、チーズの 後を欠落にすることで、そこを予測させて、 フランス語でのチーズを答えさせる hexcodeに対して、説明なしで一言で回答するという 事例を作ることで、その次の回答もシンプルになる
38 LLMは何が得意なのか? • LLMは「論理的思考力」と「常識」を提供する • カラーコードと色の名前はある種の「常識」 • 東大の理3の入試に合格できる程度の論理的思考力は持ち合わせている • 一方でLLMには「常識」はあるが「知識」はない • ハルシネーションが発生するのは「知識」を問うから • 高校までの知識程度の「常識」や、文章処理能力であれば、極めてうまく動 作する • 「知識」が欲しいなら、RAGを作る必要がある(割愛) • コードで書くのはしんどいが、常識と論理的思考力で処理できる問 題であれば、極めてうまく刺さる • 広聴AIでは、文章分割や要約といったタスクでうまく機能している(後述)
39 Structured Output • 2024年8月、OpenAIはAPIにStructured Output機能を搭載 • ユーザが指定したJSONフォーマットで出力させることが可能になった • https://openai.com/ja-JP/index/introducing-structured-outputs-in-the-api/ • https://platform.openai.com/docs/guides/structured-outputs • Structured Outputによって、LLMは「自然言語を入力すると、JSONが 吐き出されるモジュール」として、システムの一部に組み込み可能になっ た • それまでのLLMは自然言語がそのまま出力されるため、システムに組み込みづら かった • jsonのフォーマットを例示することで、90%くらいの確率で準拠させることは可能 であったが、それでも10%はエラーが起こる • 10%の確率でエラーが起こるモジュールをシステムに組み込むのは困難 • ウェブサービスから使うLLMと、APIから使うLLMは見え方が全く異なる ので、APIからLLMを叩く経験はやっておいたほうがいい
40 失敗例)JSON出力をプロンプトで指定 • 最初に説明文が付いてから、JSONが出力され、パースが困難 • JSONのフォーマットがLLMの気分で決定される • プロンプトエンジニアリングを頑張らないといけない
41 JSONを出力フォーマットで強制する • JSON Schemaで型を渡すと、 その型を満たすJSONを返して くれる • これにより、こちらが狙った フォーマットでの出力を行わ せることができ、プログラム に組み込みやすくなった • JSON Schemaの入れ子も可能な ので、特定の型の配列を持った JSONという指定もできる • これにより、データの解析精 度、自然言語の処理精度が格 段に向上した
42 目次 • 基礎技術解説 • 文字、トークナイズ、単語ベクトル、文脈ベクトル • LLM、InstructionTuning 、Structured Output • クラスタリング、次元圧縮 • 広聴AI技術解説 • TTTCと広聴AIの関係性 • 広聴AIの処理の流れ
43 クラスタリング • 似た特徴をもつデータ同士を自動でグループ分けすること 同じデータに対して、 様々なクラスタリングア ルゴリズムを適用して、 どうなるかの可視化 https://scikit-learn.org/stable/modules/clustering.html
44 埋め込みベクトルは、クラスタリング可能 • 埋め込みベクトルは数値の塊 • 同じような意味の言葉や文章は、 近い位置にある • コサイン類似度やユークリッド距 離で、ベクトル間の距離が計測可 能 • 適切にクラスタリングを行うこと で、同じようなベクトルを集約で きる=同じような意見を集約でき る • これがTTTCや広聴AIの発想の根源
45 階層化クラスタリング • クラスタの統合を繰り返し、 最終的に1つのクラスタに統 合していく手法 • 閾値(このグラフだとY軸) を下げていくと、クラスタを 少しずつ割っていける • 広聴AIではWard法という階 層化クラスタリングアルゴリ ズムが採用されている https://scikitlearn.org/stable/auto_examples/cluster/plot_agglomerative_dendro gram.html
46 次元圧縮 • 次元圧縮とは、データの本質だけを残して余分 な情報を捨て、省けるだけの“軸”を減らすこ とで、より少ない数の特徴で表現し直す技術 • 広聴AIでは1536次元 → 2次元といった圧縮が行わ れている • 主成分分析、PCA • 一番基本的なアルゴリズム • 相関のある軸を中心にグラフ全体を回転させて、有 効な軸を残す手法 • 次元数が少なく、軸間の相関が強い場合にうまく機 能する • UMAP • 局所的な距離構造を維持したまま、データをより低 次元に写しかえる手法 • 曲がったゴムシートを空間に押し付けて、低次元に写し かえるイメージ • TTTCや広聴AIはこのアルゴリズムを利用している ChatGPTに作らせたUMAPのイメージ図 https://chatgpt.com/c/68499a76-3a44-8009bec9-fc07df928622
47 UMAPのデモンストレーション • MNIST(手書きの数字)のデータをPCAとUMAPで2次元の次元圧縮して可視化 • PCAはグチャグチャだが、UMAPは上手く分離出来ている • 手書きだと間違いやすい、{0,6}、{2,3,5,8}、{4,9,7} が隣接しながら分離されている ① ⑤ ⑧ ⓪ ② ⑥ ③ ④ ⑨ ⑦
48 目次 • 基礎技術解説 • 文字、トークナイズ、単語ベクトル、文脈ベクトル • LLM、InstructionTuning 、Structured Output • クラスタリング、次元圧縮 • 広聴AI技術解説 • TTTCと広聴AIの関係性 • 広聴AIの処理の流れ
49 Talk to the city(TTTC)の開発元 • AI Objectives Institute • Guiding AI to defend and enhance human agency • 「人間の主体性を守り、強化するために、AIを導く」ことを 目的に設立されたNPO • AIの理論研究と社会実装を両輪で実施している • 創設者ピーター・エッカーズリーPeter Eckersley • Let's Encryptの創設者の一人として知られている、病没 • 現在の活動 • Talk to the city • 意見可視化エンジン、定量分析では見えない、定性分析を行い、政 策立案を支援 • Moral Learning • AIに道徳的な価値観を身に着けさせる研究 • AI Supply Chain Observatory • AIによるサプライチェーンの監視、市場監視、ブラックスワンへの 備え • がん治療薬の不足に対するハッカソンを実施 https://ai.objectives.institute/
50 TTTCのTurboとScatter • TTTCにはTurbo(左)とScatter(右)という二つの実装がある • Turboは意見分類・ブレイクダウン、Scatterは意見可視化 https://tttc-turbo.web.app/report/taiwan-zh https://broadlistening.seisakukikaku.metro.tokyo.lg.jp/ 20250131/index.html
51 TTTC Scatterの課題、広聴AIへ • TTTC Scatterはレポート作成 にコマンドラインが必須で、プ ログラマ専用ツールになってい る • 自治体職員が自ら使うには、かな りしんどい構成 • 広聴AIでは、管理画面を作成し、 誰でもレポートを作成可能にし、 プレビュー機能を搭載 • dockerで環境構築を容易にした https://github.com/AIObjectives/talk-to-the-cityreports/tree/main/scatter
52 広聴AIとTTTCの関係性と歴史 • 広聴AIはTalk to the City(TTTC)のScatterからのフォーク • 西尾がTTTCを調査・研究していたところに、安野が西尾に声をかけて2024年の都知事 選で本番投入、その後もチーム安野(メインは角野なすか氏)による細かい改良が続く • 都知事選以後、「日テレ衆院選報道」「東京都“シン東京2050”」などでチーム安野で 大規模な改修を入れまくり、元のコードから大きく乖離 • 東京都での採用以後、TTTCを様々な政党が活用し、ブロードリスニングが日本の政党で 一般化、国会質問や地方自治体などでも使われるように • 2025年2月、安野がデジタル民主主義2030(DD2030)を設立、大規模改修版を「広聴 AI」という名前に変えてリリース&DD2030に移管、コミュニティベースの開発へ移行 • DD2030で大規模改修をへて「広聴AI」としてラベルを変えてリリース • 参考資料 • https://note.com/nishiohirokazu/n/n0661204bda5b • https://note.com/nishiohirokazu/n/nb37adf96fe50 • https://note.com/annotakahiro24/n/na0e296bc30b8 • https://code4japancommunity.notion.site/b018bcee86cb4e03829cade5cb62cee6
53 現在の広聴AIのレポジトリ状況 • 広聴AIはTTTC Scatterをベースとし、チーム安野の改造を経て、デジタル民主主義 2030(DD2030)に移管(2025年2月)、コミュニティベースの開発へ移行 • 移管後に一般ユーザでも使えるように管理画面を作成したり、Turboの機能をとりこん だり、アーキテクチャ全体を見直す大改造を実施、原型がなくなる(Devinを全力投入、 AIコーディング) • 2025年5月、安野が政治政党「チームみらい」を結党しDD2030のボードメンバーから 退任、その後チームみらい版がフォークした • チームみらい側でも独自の改造を行い、DD2030側にPull Requestが出されている https://github.com/AIObjectives/talk-to-the-city-reports AI Objective、TTTC Scatter 最終コミットは2024年5月 https://github.com/takahiroanno2024/anno-broadlistening フォーク チーム安野改造版TTTC(安野ブロードリスニング) https://github.com/digitaldemocracy2030/kouchou-ai フォーク+移管+リネーム ↑ 原型をとどめない大改造 2025年2月 デジタル民主主義2030版 広聴AI フォーク Pull Request チームみらい版広聴AI https://github.com/team-mirai/kouchou-ai
54 目次 • 基礎技術解説 • 文字、トークナイズ、単語ベクトル、文脈ベクトル • LLM、InstructionTuning 、Structured Output • クラスタリング、次元圧縮 • 広聴AI技術解説 • TTTCと広聴AIの関係性 • 広聴AIの処理の流れ
55 広聴AIの処理の流れ • 広聴AIのレポートページの下部には 分析手順の流れが記載されている • これを順に追いかけるのが分かりや すい • ①抽出、②埋め込み、③意見グルー プ化、④初期ラベリング、⑤統合ラ ベリング、⑥要約、⑦出力、⑧表示 • コアアルゴリズムは /server/broadlistening/ にまとまっ ている • https://github.com/digitaldemocracy 2030/kouchouai/tree/main/server/broadlistening https://kouchou-ai.dd2030.org/5f0b335ce07c-40e2-bce8-eca275da44ca/
56 ① 抽出 Extraction • extraction.pyのextract_argumentsがコア • プロンプトをLLMに渡して、結果のJSONを受け取る https://github.com/digitaldemocracy2030/kouchou-ai/blob/main/server/broadlistening/pipeline/steps/extraction.py#L147
57 抽出では何をやっているのか? • 標準のシステムプロンプトでは、意見を分割するように指示 あなたは専門的なリサーチアシスタントです。与えられたテキストから、 意見を抽出して整理してください。 # 指示 * 入出力の例に記載したような形式で文字列のリストを返してください * 必要な場合は2つの別個の意見に分割してください。多くの場合は1つ の議論にまとめる方が望ましいです。 * 整理した意見は日本語で出力してください <<以下、fewshot learning のための事例は後述>> https://github.com/digitaldemocracy2030/kouchou-ai/blob/main/client-admin/app/create/extractionPrompt.ts
58 生の意見は、マジでしんどい • 私たち地域住民は、いつまで行政の曖昧な姿勢に振り回され続けなければ ならないのでしょうか。川沿いの貴重な緑地を守り、鳥や昆虫が戻る環境 を取り戻してほしいという切実な声が上がっているのに、その一方で駅前 には「にぎわい創出」と称して商業施設を誘致し、若者の雇用を増やして ほしいという要望も山積みです。さらに、保育園の待機児童ゼロ、学童保 育の延長など、子育て支援を充実させろという悲痛な叫びが毎日のように 届いている――にもかかわらず、あなた方は具体的な計画も示さず、ただ 場当たり的な言い訳を並べ立てるばかりではありませんか! 私たちは、これらの多様な願いを「互いに競合させるから難しい」などと いう聞き飽きた逃げ口上で片づけるのではなく、環境・経済・福祉を同時 に推進するための、【いつ何を・誰が・どうやって】実行するのか明確に 記したロードマップを直ちに示せと強く要求します。しかも、進捗状況を ブラックボックスに隠すなど論外! 月次で数値と達成度を公開し、住民 の前で責任を取る姿勢を見せるべきです。 ※この意見はChatGPTに生成されたものです
59 意見を分割すると、みんなハッピー • ChatGPTに意見を分割させた結果 • 「川沿いの貴重な緑地を守り、鳥や昆虫が戻る環境を取り戻すべき」 • 「駅前に商業施設を誘致して若者の雇用を増やすべき」 • 「保育園の待機児童をゼロにすべき」 • 「学童保育の延長など子育て支援を充実させるべき」 • 「環境・経済・福祉を同時に推進するための具体的なロードマップを直ちに示すべ き」 • 「月次で数値と達成度を公開し、住民の前で責任を取る姿勢を見せるべき」 • https://chatgpt.com/share/6848d788-79c4-8009-bcc9-f16feebed5c0 • 意見分割は、人間的なダラダラとした文章を適切に分割し、後段で意見集 約処理しやすい形にする • 「複数の人で共通している意見」を発見するには、意見分割が有効 • (ABC)と(CBD)には共通点はないが、それぞれを{A,B,C}、{B,C,D}にバラすと、 B,Cは複数の人が主張している、となる
60 ちなみにどこが抽出されたのか? • 私たち地域住民は、いつまで行政の曖昧な姿勢に振り回され続けなければ ならないのでしょうか。川沿いの貴重な緑地を守り、鳥や昆虫が戻る環境 を取り戻してほしいという切実な声が上がっているのに、その一方で駅前 には「にぎわい創出」と称して商業施設を誘致し、若者の雇用を増やして ほしいという要望も山積みです。さらに、保育園の待機児童ゼロ、学童保 育の延長など、子育て支援を充実させろという悲痛な叫びが毎日のように 届いている――にもかかわらず、あなた方は具体的な計画も示さず、ただ 場当たり的な言い訳を並べ立てるばかりではありませんか! 私たちは、これらの多様な願いを「互いに競合させるから難しい」などと いう聞き飽きた逃げ口上で片づけるのではなく、環境・経済・福祉を同時 に推進するための、【いつ何を・誰が・どうやって】実行するのか明確に 記したロードマップを直ちに示せと強く要求します。しかも、進捗状況を ブラックボックスに隠すなど論外! 月次で数値と達成度を公開し、住民 の前で責任を取る姿勢を見せるべきです。 建設的な要望が綺麗に抽出出来てるぽい
61 分割のためのFewshot learning • どのような文章が入力された ら、どのように分割するか、 という事例を予め入力してお く • これにより分割のための基準 をLLMに教えることができ、 出力結果を安定させている • また、出力はJSONであり、 トップレベルにArrayを置け ないので、このようなフォー マットになっている https://github.com/digitaldemocracy2030/kouchouai/blob/main/client-admin/app/create/extractionPrompt.ts
62 ② 埋め込み、embedding • 分割された意見を受け取って、エンベディングの文脈ベクトル を返すだけの実装 https://github.com/digitaldemocracy2030/kouchou-ai/blob/main/server/broadlistening/pipeline/steps/embedding.py
63 意見分割とエンベディングの相乗効果 • 意見分割によって、エンベディングが効果的になる • 口調が統一、誤字脱字が修正されることで、ノイズが消える • 攻撃的な文言が消えて、建設的な意見のみが残る • 「にもかかわらず、あなた方は具体的な計画も示さず、ただ場当たり的な言い訳を並 べ立てるばかりではありませんか!」は消えた • 人間は感情によって意見の補強をしようとする傾向があるので、普通の文章はノイズ まみれ • 単一の意見主張だけになるので、エンベディングが安定する • 複数の意見が混ざると、エンベディングも混ざる • LLMによる意見分割と成形を挟むことで、エンベディングを理想状 態で運用することができるようになる • 懸念点:ハルシネーションによって関係ない文章が抽出される可能性がある
64 ③ 意見グループ化 hierarchical_clustering • 処理の流れ • 埋め込みベクトルを、UMAPで2次元に次元圧縮する • 2次元に変換されたデータを、k-meansで細かくクラスタリング • k-meansで切られたクラスタをWard法で統合していく • 結果的に階層化クラスタリングを実現している • 入力 • 意見IDと、埋め込みベクトルの配列 • 出力、意見IDと、クラスタID、サブクラスタIDのペアの配列 • ChatGPTによるコード解説 • https://chatgpt.com/share/6848486f-2670-8009-8e0cd86844208332 https://github.com/digitaldemocracy2030/kouchou-ai/blob/main/server/broadlistening/pipeline/steps/hierarchical_clustering.py
65 意見グループ化までの処理の流れ(前半戦) • UMAP(2次元化) → k-means(クラスタ分割) → Ward法(クラスタ統合) • やっていることは極めて複雑だが、ライブラリが使われており、見かけ上のコー ド量はとても少ないので、さらっと読むとよい • 高次元データの可視化+階層化クラスタリングの定石手法 有権者の声 有権者の声 分割された意見 [0.1, 0.5, 0.7...] 分割された意見 [0.5, 0.4, 0.8...] 分割された意見 [0.9, 0.4, 0.7...] 分割された意見 [0.2, 0.6, 0.6...] 分割された意見 [0.7, 0.3, 0.5...] 分割された意見 [0.6, 0.3, 0.7...] 意見グループ化 有権者の声 抽出 意見分割 埋め込み ベクトル化 UMAP 次元圧縮 k-means クラスタ分割 Ward法 クラスタ統合
66 ④ 初期ラベリング hierarchical_initial_labelling • 細分化したクラスタに対して、ランダムに数個の標本を取得し て、それを元にLLMでラベルと説明文を付けていく • いくつかの標本を統合したような概念が付与される 公園 医療 防災 健康 安全 消防 病院 道路 警察 電力 水道 野球 場 公民 館 街路 治安 運動 場 陸橋 防犯 公務 員 商店 街 https://github.com/digitaldemocracy2030/kouchou-ai/blob/main/server/broadlistening/pipeline/steps/hierarchical_initial_labelling.py
67 初期ラベリングのプロンプトはKJ法 • 「KJ法」「表札」という専門用語を使うことで、LLMに対して短い 言葉で、やるべきタスクを正しく伝えることができる • 例)「しりとり」という言葉を使わないで「しりとり」のゲームルールを伝 えるには数百文字が必要だが、「しりとり」の四文字で事足りる • 勉強している奴ほどLLMをうまく使えるのはコレ、専門用語でぶん 殴るとLLMは効率的に動いてくれるから あなたはKJ法が得意なデータ分析者です。userのinputはグループに集まっ たラベルです。なぜそのラベルが一つのグループであるか解説し、表札 (label)をつけてください。 表札については、グループ内の具体的な論点や特徴を反映した、具体性の 高い名称を考案してください。 出力はJSONとし、フォーマットは以下のサンプルを参考にしてください。 https://github.com/digitaldemocracy2030/kouchou-ai/blob/main/client-admin/app/create/initialLabellingPrompt.ts
68 ⑤ 統合ラベリング hierarchical_merge_labelling • hierarchical_merge_labelling.p y の process_merge_labelling がアルゴリズムの本体 • 入力 • 末端クラスタのラベル • 出力 • クラスタのラベルが統合された上位 クラスタのラベル • 一つ前の階層のラベルとその説明 を持ってきて、現在の階層のラベ ルと説明文を決定する https://github.com/digitaldemocracy2030/kouchou-ai/blob/main/server/broadlistening/pipeline/steps/hierarchical_merge_labelling.py
69 統合ラベリングのプロンプトを読む 公園 医療 防災 病院 健康 安全 野球 場 公民 館 消防 陸橋 警察 防犯 電力 治安 公務 員 商店 街 健康 施設 安全 安心 道路 街路 水道 運動 場 公共 インフ ラ 福祉 施設 地域 振興 あなたはデータ分析のエキスパートです。 現在、テキストデータの階層クラスタリングを行っています。 下層のクラスタ(意見グループ)のタイトルと説明、およびそれらのクラスタが所属する上層のクラスタのテキ ストのサンプルを与えるので、上層のクラスタのタイトルと説明を作成してください。 # 指示 - 統合後のクラスタ名は、統合前のクラスタ名称をそのまま引用せず、内容に基づいた新たな名称にしてください。 - タイトルには、具体的な事象・行動(例:地域ごとの迅速対応、復興計画の着実な進展、効果的な情報共有・地 域協力など)を含めてください - 可能な限り具体的な表現を用いるようにし、抽象的な表現は避けてください - 「多様な意見」などの抽象的な表現は避けてください - 出力例に示したJSON形式で出力してください https://github.com/digitaldemocracy2030/kouchou-ai/blob/main/client-admin/app/create/mergeLabellingPrompt.ts
70 余録)クラスタ密度計算 • フロント側に「濃いクラスタ抽出」という、密度が高い箇所を限定 して表示する機能がある • hierarchical_merge_labelling.py の calculate_cluster_density で計算さ れる値を元に、表示されるノードを限定する機能 • クラスタ内の他のノードとの平均距離を求め、パーセンタイル値を求めるこ とで、クラスタ内で相対的に密度が濃い場所を抽出できるようにしている • 「似たような意見が大量に集まっている場所」を疑似的に抽出するアルゴリ ズム • 実装した西尾曰く「リリース日時を優先して安価な現状の実装で進 んだ」 • なので、この機能は割と暫定実装だと考えてよいです • https://scrapbox.io/nishio/%E5%BA%83%E8%81%B4AI%E3%81%A 8%E6%BF%83%E3%81%84%E3%82%AF%E3%83%A9%E3%82%B9 %E3%82%BF%E6%8A%BD%E5%87%BA
71 ⑥ 要約 hierarchical_overview • トップレベルのクラスタのラベルと説明文をかき集めて、全体 の説明文を作る機能、レポートではに最上部に掲示される (タイトルは人間が作成するが、説明文はLLMが作る) https://github.com/digitaldemocracy2030/kouchou-ai/blob/main/server/broadlistening/pipeline/steps/hierarchical_overview.py
72 要約のプロンプト 健康 施設 安全 安心 公共 インフラ 福祉 施設 地域 振興 あなたはシンクタンクで働く専門のリサーチアシスタントです。 チームは特定のテーマに関してパブリック・コンサルテーションを実施し、 異なる選択肢の意見グループを分析し始めています。 これから意見グループのリストとその簡単な分析が提供されます。 あなたの仕事は、調査結果の簡潔な要約を返すことです。要約は非常に簡 潔に(最大で1段落、最大4文)まとめ、無意味な言葉を避けてください。 出力は日本語で行ってください。 https://github.com/digitaldemocracy2030/kouchou-ai/blob/main/client-admin/app/create/overviewPrompt.ts
73 ⑦ 出力 hierarchical_aggregation • これまでの全てのプロセスで生成さ れた中間ファイルを結合 • 1つのJSONを生成することで、こ のJSONを読み込めばビジュアライ ズが行えるという状態にする • ビジュアライズ関連を改造するので あれば、ここに手を入れると、 JSONが好き勝手に弄れるので、試 験的な機能はいったんここで差し込 むとよい、後で適切な位置に移動さ せる • コードはかなり複雑だが、やってる ことはデータのjoinなので、難しく 構える必要はない CSVファイル 一般ユーザ ウェブアクセス client画面 admin画面 Server Fast APIのAPI層 結果のJSON Broad Listening モジュール 広聴AIのサーバ構成概略 • サーバ構成はざっくり右図 https://github.com/digitaldemocracy2030/kouchou-ai/blob/main/server/broadlistening/pipeline/steps/hierarchical_aggregation.py
74 ⑧ 表示 hierarchical_visualization • 生成されたJSONを元に、 nodeで静的ウェブページを生 成する機能 • 現在は使われていない • おそらくTTTCのコードの残骸 • 現在は、serverが生成された JSONをHTTPで配信して、フ ロントエンドが動的に読み込 んで、描画を行う構成になっ ている https://github.com/digitaldemocracy2030/kouchou-ai/blob/main/server/broadlistening/pipeline/steps/hierarchical_visualization.py
75 広聴AIの全体の処理の流れ 有権者の声 有権者の声 有権者の声 分割された意見 [0.1, 0.5, 0.7...] 分割された意見 [0.5, 0.4, 0.8...] 分割された意見 [0.9, 0.4, 0.7...] 分割された意見 [0.2, 0.6, 0.6...] 分割された意見 [0.7, 0.3, 0.5...] 分割された意見 [0.6, 0.3, 0.7...] ①抽出 意見分割 公園 医療 防災 病院 健康 消防 道路 街路 陸橋 警察 電力 治安 水道 ④初期ラベリング 公共 インフ ラ 防犯 公務 員 商店 街 ⑤統合ラベリング Ward法 クラスタ統合 健康 施設 安全 安心 運動 場 野球 場 公民 館 k-means クラスタ分割 UMAP 次元圧縮 ②埋め込み ベクトル化 安全 ③意見グループ化 福祉 施設 地域 振興 ⑥要約
76 余録)TTTCと広聴AIのアルゴリズムの違い • 広聴AIのアルゴリズム • エンベデッドベクトル→UMAP→ k-means → WARD法 → LLMでクラスタの名前付け • k-meansで空間を切断しているので、クラスタに連続性があ る、しかし、k-meansは標本の粗密がある場所を境界にする ように動作するわけではないので、本当の意味での「クラス タ」が切れていない可能性がある • TTTCは2系統に処理が分岐する • エンベデッドベクトル→BERTopic • BERTとHDBSCSNを組み合わせた階層化クラスタリングアルゴ リズム • これ単体でも使えるが、TTTCではクラスタの名前付けに活用 • エンベデッドベクトル→ UMAP → SpectralClustering • SpectralClusteringは、標本の粗密がある場所でいい感じに切 れるが、変な飛び地ができやすいという欠点がある • 広聴AIでは、精度と説明容易性のトレードオフから、 説明容易性の側をとった実装になっている • 広聴AIの利用者は一般市民及び政治家であり、「クラスタリ ングアルゴリズムの特性」を理解しているわけではない • そもそも2Dにマッピングしているのは説明容易性のためだし TTTCで飛び地が生まれている例 https://news.ntv.co.jp/static/shugiinsenkyo2024/whole-1022/index.html
77 まとめ • 広聴AIは現代のデータサイエンスの技術の詰め合わせ • LLMによる自然言語の分割と成形 • エンベディングによる文脈ベクトルの取得 • 文脈ベクトルをUMAPして、それからクラスタリング、クラスタ統合 • クラスタリングにLLMでラベルと説明文を付与 • クラスタのラベルと説明文から、 LLMで全体概要を作成 • LLMやエンベディングをプログラムに組み込むことで、複雑な 自然言語を処理できるようになり、これは広聴AIをはじめとす るこれまでにない新しいサービスを作るチャンス • 新しいパラダイムのプログラミングを皆で楽しみましょう!