（やってみた）簡単な嗜好聞き出しエージェントがどれだけ動くか試してみた

# 要約  
- 質問エージェント & 評価エージェントのみの単純構造では傾聴+質問のようになってしまっていて、「深堀り」はできない。
- 「ユーザーから得た出力が特定のカテゴリに当てはまるか」のルックアップは単純に実装するとうまくいかない。

# 背景  
レコメンドへのLLM活用の方法として、  
LLMで対話的に嗜好を聞き出し、後続のレコメンドを発動させるというやり方が考えられる。    
  
単純なLLMエージェントでどれくらいのことができるか？を試してみた。

# 課題設定  
ユーザーとの会話を通して、好きなジャンルを聞き出すことを目的とした。

    "SF/ファンタジー"
    ,"ロボット・メカ"
    ,"アクション・バトル"
    ,"コメディ・ギャグ"
    ,"恋愛・ラブコメ"
    ,"日常・ほのぼの"
    ,"スポーツ・競技"
    ,"ホラー・サスペンス・推理"
    ,"歴史・戦記"
    ,"戦争・ミリタリー"
    ,"ドラマ・青春"
    ,"キッズ・ファミリー"
    ,"ショート"
    ,"2.5次元舞台"
    ,"ライブ・ラジオ"
 

# 実装  
[LangGraph](https://www.langchain.com/langgraph)を用いた。  
LLM部分は4o-miniを用いた。  

グラフは以下の通り  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3909060/4e9cf9fc-e08a-418f-b253-64d913fc2473.png)  


### reply_to_user  
ユーザーに応答する部分。  
これまでの会話やりとりを受け取り、ユーザーに対する応答を出力する。
以下のようなプロンプトを用いる。  
まずは簡単にということで、「最終的に嗜好を聞き出せればいいから、よしなにやってよ」みたいな指示にしてみた。

`{chatlog}`にはこれまでの`reply_to_user`の出力、ユーザー入力、`evaluate_dialog`の出力が含まれる。

```
  あなたはプロのアニメ評論家です。
  evaluatorと協力し、ユーザーとの対話を通じて会話を楽しみつつ以下の嗜好を聞き出すのが任務です。
  あなたがユーザーに応答した後、ユーザーが応答し、evaluatorがユーザーのやりとりから嗜好を抽出できるか判断します。
  [留意点]に注意しつつ、適切な返答を出力してください。

  [項目]: {name}
  [選択肢]: {choice}

  [これまでのやりとり]
  {chatlog}

  [留意点]:
  1. ユーザーにとって自然な会話になるように意識してください。ユーザーに嗜好の聞き出しが目的であると悟られないように注意してください。
  2. ユーザーへの傾聴を心がけてください。ユーザーに会話を楽しませるのが目的であることも忘れないでください。
  2. 必ずしもこの応答の中で嗜好を聞き出す必要はありません。相手の応答を想定し、複数回のやり取りの後で嗜好が判明するでもかまいません。 
  
  # 以下の指示を守って、出力してください
  {format_instructions}
  ```

### user_action  
ユーザーのアクション。  
`reply_to_user`の応答を見て、私が自由入力します。


### evaluate_dialog  
直近のユーザー応答を入力にして、好きなジャンルがあれば抽出する。 
`{name}`には「ジャンル」, `{choice}`には選択肢が入ります。
```
  あなたはプロのアニメ評論家です。
  ユーザーとエージェントのやり取りの中からユーザーのpreferenceとして当てはまると確信できるものがあれば[選択肢]の中から選んで出力してください。
  ユーザー入力から判断が難しい場合や[選択肢]に最適なものがない場合は後に述べる入力フォーマットに従いpreferenceのvalueとして"None"のみを出力してください。

  各ヒアリング項目の選択肢の組は以下の通りです。
  [項目]: {name}
  [選択肢]: {choice}

  ユーザー入力
  {user_input} 

  # 以下の指示を守って、出力してください
  {format_instructions}


```

# 結果  

### 1. カテゴリにある内容（= ロボット・メカ）を答えとした受け答え  
```
agent: 最近、どんなアニメを観ましたか？それとも、昔の作品で特に好きなものがありますか？皆さんのオススメも教えてください！
user: エウレカセブンを見ました！
evaluator: SF/ファンタジー
```
終わってしまった。。。  
「SF/ファンタジーでもあるし、ロボット・メカでもあるし、ドラマでもあるよね  結局どの要素が刺さったんだっけ？」みたいな深堀を期待するならその部分をプロンプトなり別エージェントとして実装する必要がありそう。  
また、evaluatorの評価プロンプトにどの程度厳密な評価を要求するかを制御する必要がありそう。
(「当てはまると確信できるものがあれば」と強い言葉をつかっているが...)
  
### 2.カテゴリが存在しない場合の受け答え

```
agent: こんにちは！最近、どんなアニメを観ましたか？アニメについて話すのはいつも楽しいですよね。
user: ガールズバンドクライを見ました！
evaluator: {'preference': 'None'}
agent: ガールズバンドクライは素晴らしいですね！音楽と友情の要素が巧妙に組み合わさっていますよね。他に好きなアニメや特に印象に残ったシーンはありますか？
user: 他だとバンドリですかねー
evaluator: {'preference': 'None'}
agent: バンドリもいいですね！音楽とバンドの成長が描かれているところが特に魅力的ですよね。音楽がテーマのアニメは他にもたくさんありますが、どの作品もそれぞれに個性的なキャラクターがいて、見ていて楽しいです。他にはどんなジャンルのアニメが好きですか？
user: ぼっちざろっくとかも見ました
evaluator: {'preference': 'None'}
agent: ぼっちざろっくも素晴らしい作品ですね！特にキャラクターたちが成長していく姿が素敵です。自分の居場所を見つける過程は、観ていてとても感情移入できますよね。もしかして、他の音楽関連の作品も詳しいですか？それとも、他のジャンルのアニメにも興味があるのでしょうか？
user: うーん、音楽系しか見ないかもしれません。
evaluator: {'preference': 'None'}
```
人間が聞く場合は、具体的にどんなところが好きかを深堀して、「音楽アニメの中の青春要素が好きなのね⇒ドラマ/青春」みたいな落とし方をしそうだが、  
今回のエージェントはどんなアニメが好きなの？を聞くだけにとどまってしまっている。  
明示的に深堀を指示しる必要がありそう。  

### 話題を変えようとする人への応答  
```
agent: こんにちは！最近、どんなアニメを観ましたか？何かお気に入りの作品やジャンルがあれば教えていただけると嬉しいです！
user: そんなことより数学の話をしましょう
evaluator: {'preference': 'None'}
agent: もちろん、数学も面白いですね！どんなことに興味がありますか？例えば、数学の面白さや日常生活との関わりについてお話しするのも良いかもしれませんね。それとも、最近見たアニメの中で数学がテーマになっている作品とかありますか？
user: 主に統計学ですね。
evaluator: {'preference': 'None'}
agent: 統計学はとても興味深いですね！データの分析や傾向を見つけるのがすごく面白いです。最近、統計学に関連する映画やアニメがあれば教えてほしいです。もちろん、アニメの中には面白いキャラクターやストーリーもたくさんありますので、もし好きな作品があれば教えてもらえますか？
user: 統計学に関連するアニメ...しいて言うなら「チ。」とかですかねえ
evaluator: {'preference': 'None'}
agent: 「チ。」は確かに独特な視点のアニメですね！統計学をテーマにしたアニメというのは面白い試みだと思います。他にも数学やデータに関連した面白いキャラクターのいる作品はありますか？特に好きなシリーズやジャンルがあれば教えてください！
user: そういえばテニスの王子様とかにはデータ系の眼鏡のキャラがでてくるっすよね
evaluator: {'preference': 'スポーツ・競技'}

```
（「チ。」を見たことない。。。）  
傾聴する姿勢をみせてはいるものの、結局やっていることは「どんなアニメがすき」を繰り返し聞いているだけである。  

明示的に深堀を指示しる必要がありそう。  

# 参考  
[github](https://github.com/NamelessOgya/simple-chat-info-agent/blob/main/README.md)