talk-to-the-cityを使ってみた

## 概要

- OSS「talk-to-the-city」を試してみました
- 政治の話題ではなく、漫画のコメント分析に使用しました

[https://github.com/AIObjectives/talk-to-the-city-reports/tree/main/scatter](https://github.com/AIObjectives/talk-to-the-city-reports/tree/main/scatter)


## talk-to-the-city とは？

「talk-to-the-city」は、多くの意見をクラスタリングや分析できるオープンソースソフトウェア（OSS）です。

> Talk to the City is an open-source LLM interface for improving collective deliberation and decision-making by analyzing detailed, qualitative data. It aggregates responses and arranges similar arguments into clusters.

> Talk to the City は、詳細な定性データを分析することで、集団的な審議と意思決定を改善するためのオープンソースの LLM インターフェイスです。応答を集約し、類似の議論をクラスターに整理します。

引用元：[https://ai.objectives.institute/talk-to-the-city](https://ai.objectives.institute/talk-to-the-city)

このツールでは、以下のように色付きのクラスタに意見が分類され、それぞれのクラスタにタイトルが付与されます。

![スクリーンショット 2024-09-17 21.53.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1228403/44f83960-1a74-cdcb-2d0e-b336644b7d41.png)

引用元：[https://tttc.dev/heal-michigan](https://tttc.dev/heal-michigan)


## 方針

「talk-to-the-city-reports」は、`scatter` と `turbo` の2つのコンポーネントで構成されています。
READMEによると、`turbo` の方がグラフやLLMを多く活用しているようですが、今回は実験的な目的が強いため、`scatter` を使用しました。


## 実行環境
 - macOS Sonoma 14.6.1
 - python 3.11.10
 - npm 10.2.3


## 準備

### 入力用の CSV ファイル作成

`pipeline/inputs/` フォルダに CSV ファイルを配置します。
ChatGPT を使用して、必須項目である `comment-id` と `comment-body` だけを含むCSV ファイルを作成しました。


<details><summary>入力データ</summary>


```demo.csv
comment-id,comment-body
1,ストーリーが斬新で引き込まれましたが、キャラクターの成長が少し物足りないです。
2,絵が美しく、アクションシーンも迫力満点。ただ、展開が予測しやすいのが残念。
3,キャラクターの感情表現が豊かで共感できる部分が多かったです。
4,設定が面白いけど、途中でテンポが悪くなってしまったのが残念。
5,主人公の成長が描かれていて感動しましたが、サブキャラが薄い印象。
6,アートスタイルが独特で魅力的。ただし、ストーリーが少し複雑すぎる。
7,笑いあり涙ありの素晴らしい作品でしたが、エンディングが急ぎすぎた感じ。
8,キャラクター同士の関係性がリアルで良かったです。
9,バトルシーンが多くて飽きないけど、もう少し日常シーンが欲しかった。
10,テーマが深く考えさせられる内容でしたが、少し重すぎる部分も。
11,絵が綺麗で見やすいですが、ストーリーが少し平凡に感じました。
12,キャラクターのデザインが素晴らしいが、ストーリー展開が遅い。
13,感動的なシーンが多くて泣けましたが、コメディ要素が少ない。
14,アクションシーンが迫力満点で楽しめましたが、キャラの掘り下げが足りない。
15,ストーリーが緻密で引き込まれましたが、結末が予想外すぎて驚きました。
16,キャラクターの成長が描かれていて良かったですが、展開が少し遅い。
17,絵が美しく、キャラクターも魅力的。ただし、ストーリーが少し単調。
18,バトルシーンが多くて楽しめましたが、もう少し感情描写が欲しかった。
19,テーマが深くて考えさせられる内容でしたが、少し難解でした。
20,キャラクター同士の関係性がリアルで良かったですが、展開が遅い。
21,アートスタイルが独特で魅力的ですが、ストーリーが複雑すぎる。
22,笑いあり涙ありの素晴らしい作品でしたが、エンディングが急ぎすぎた。
23,キャラクターの感情表現が豊かで共感できる部分が多かったです。
24,設定が面白いけど、途中でテンポが悪くなったのが残念。
25,主人公の成長が描かれていて感動しましたが、サブキャラが薄い印象。
26,アートスタイルが独特で魅力的ですが、ストーリーが少し複雑すぎる。
27,笑いあり涙ありの素晴らしい作品でしたが、エンディングが急ぎすぎた感じ。
28,キャラクター同士の関係性がリアルで良かったです。
29,バトルシーンが多くて飽きないけど、もう少し日常シーンが欲しかった。
30,テーマが深く考えさせられる内容でしたが、少し重すぎる部分も。
31,絵が綺麗で見やすいですが、ストーリーが少し平凡に感じました。
32,キャラクターのデザインが素晴らしいが、ストーリー展開が遅い。
33,感動的なシーンが多くて泣けましたが、コメディ要素が少ない。
34,アクションシーンが迫力満点で楽しめましたが、キャラの掘り下げが足りない。
35,ストーリーが緻密で引き込まれましたが、結末が予想外すぎて驚きました。
36,キャラクターの成長が描かれていて良かったですが、展開が少し遅い。
37,絵が美しく、キャラクターも魅力的。ただし、ストーリーが少し単調。
38,バトルシーンが多くて楽しめましたが、もう少し感情描写が欲しかった。
39,テーマが深くて考えさせられる内容でしたが、少し難解でした。
40,キャラクター同士の関係性がリアルで良かったですが、展開が遅い。
41,アートスタイルが独特で魅力的ですが、ストーリーが複雑すぎる。
42,笑いあり涙ありの素晴らしい作品でしたが、エンディングが急ぎすぎた。
43,キャラクターの感情表現が豊かで共感できる部分が多かったです。
44,設定が面白いけど、途中でテンポが悪くなったのが残念。
45,主人公の成長が描かれていて感動しましたが、サブキャラが薄い印象。
46,アートスタイルが独特で魅力的ですが、ストーリーが少し複雑すぎる。
47,笑いあり涙ありの素晴らしい作品でしたが、エンディングが急ぎすぎた感じ。
48,キャラクター同士の関係性がリアルで良かったです。
49,バトルシーンが多くて飽きないけど、もう少し日常シーンが欲しかった。
50,テーマが深く考えさせられる内容でしたが、少し重すぎる部分も。
```
</details>

### config の json ファイル作成

このアプリで使用する設定値を決定します。`input` には、作成した CSV ファイルの名前を指定します。また、その他の項目として `model` や `limit` などを指定します。


``` demo.json
{
  "name": "Recursive Public, Agenda Setting",
  "question": "漫画のコメントを使用して、今後活用できる内容の分類をするとどのような結果になりますか？",
  "input": "demo", 
  "model": "gpt-3.5-turbo-0125",
  "extraction": {
    "workers": 3,
    "limit": 120
  },
  "clustering": {
    "clusters": 3
  },
  "translation": {
    "model": "gpt-3.5-turbo-0125",
    "languages": ["Japanese"],
    "flags": ["JP"]
  },
  "intro": "This AI-generated report relies on data from a Polis consultation run by the Recursive Public team."
}
```



### プロンプトの修正（任意）

上記でも実行は可能です。
しかし、入力データによってはクラスタリングが正常に行われない場合があります。

ログを見る限り、その原因として「AIに関する議論でない」や「英語でない」という理由が含まれているようです。これを回避するために、必要に応じて以下のプロンプトを修正してください。

```
scatter/pipeline/prompts/extraction/default.txt
```

さらに、`scatter/pipeline/prompts` 以下にある他のプロンプトも調整することで、精度の向上が期待できます。


## 実行

### データ解析の実行

`pipeline` ディレクトリで `main.py` を実行する際、事前に作成した `demo.json` を指定します。

```shell
% pwd
/Users/hoge/Downloads/talk-to-the-city-reports-main/scatter/pipeline
% python main.py configs/demo.json
```

### サーバの起動

`scatter` ディレクトリでアプリを起動します。

```shell
% pwd        
/Users/hoge/Downloads/talk-to-the-city-reports-main/scatter
% http-server -p 8080
```

## 結果

以下の URL にアクセスして、実行結果を確認します。  
`localhost` ではアクセスに失敗したため、`127.0.0.1` を指定しました。

`http://127.0.0.1:8080/pipeline/outputs/demo/report/`

### クラスタリング

こちらはクラスタリング結果です。
ダミーデータのため、きれいに分類されていますが、実際のデータではより散らばりが大きくなっていました。

![クラスタリング結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1228403/3c7cad66-1c8c-790c-a72e-276aecf30b64.png)

### 要約

ストーリーに関する要約も確認できます。英語と日本語が混在しているため、基本的には日本語に翻訳しながら確認しました。

![要約の確認](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1228403/f6907fb2-ea12-c464-c776-e180efb1a346.png)

## おわりに

「talk-to-the-city」は、政治の話題に限らず、さまざまな分野に適用できる可能性があると感じました。
gpt3.5-turboを使用し、入力が50件の場合、一回の実行で0.05ドル程度の料金がかかりました。
モデルをより高性能なものに変更したり、プロンプトを適切に作り込むことで、さらなる精度向上が期待できると思います。

## 参考
 - https://note.com/nishiohirokazu/n/n0661204bda5b
 - https://ai.objectives.institute/talk-to-the-city
 - https://tttc.dev/heal-michigan