👻

【Dify】自分の代わりにリゼロの面白さを伝えてくれるAIアプリを作ろう!

2024/07/03に公開

初めに

Difyが話題になってから少し日が経ってしまいましたが、自分もDifyで何か作りたいと思い、今回取り組みました。Difyを触ってみた感想としては、LLMを用いたアプリ開発やRAGに関わったことのある人なら、ドキュメントをあまり読まなくても、直感的に操作できて、ある程度の完成度のものを作れそうです。今回の記事ではあまり細かい操作方法も書きませんし、高度なこともしませんが、まだDify触ってない人が触るきっかけになってくれればと思います!
https://dify.ai/jp

何を作ったか

私は「Reゼロから始まる異世界生活(リゼロ)」というアニメが好きです。アニメが面白くて、普段読まないラノベを買ってアニメの続きを読むくらいには好きです。リゼロは人気アニメですが、万人が知っているというレベルではないですし、アニメ好きな人の中でもあまりハマらない人もいるというのが私の感じるところです。知らない人に「リゼロはこういうところが面白い」という話をこれまで何回もしてきたのですが、それを自分の代わりに答えてくれるアプリがあったらいいなと思ったのが今回のAIアプリ作成のきっかけです。(Difyのワークフローのことを今回はアプリと呼ぶことにします)

http://re-zero-anime.jp/tv/story/

どんな機能を作ったか

どんな機能を作ったかをざっくり説明します。
ユーザーの質問に対して、それが以下のどの質問に分類されるかを判断し、それぞれ異なる追加処理を行った上で最終的な回答を出力するアプリになっています。

  • リゼロの面白さを伝える機能
    • これが本来の目的ですね!
  • リゼロのあらすじを教える機能
    • ちょうど3期が始まるので1期・2期のあらすじが聞けたら便利そうかなって機能です
  • 上記ではないリゼロ関係の質問に対してweb検索して回答する機能
    • 事前用意してないリゼロの質問にも答えられるようにしたいなって機能です
  • リゼロに関係のない質問には答えない機能

Difyを動かす

では、まずDifyを動かしましょう!といってもここら辺は既にわかりやすく解説してくれている記事がたくさんあります。Difyはクラウド版も利用することができますが、OSSなので今回私はローカルで動かしています。
詳しい構築手順は以下のコンフルなどを参考にしてみてください。
https://zenn.dev/karaage0703/articles/6bcbaf37d6607d

手順といってもほぼdocker compose upするだけなのですが、私は1点だけコードを修正してからdockerコンテナをビルドします。
以下はコードの一部ですが、restart: alwaysになっている部分を全てrestart: noに変更しています。

docker-compose.yaml
services:
  # API service
  api:
    image: langgenius/dify-api:0.6.12-fix1
    restart: no

こうすることで、終了するときにコンテナを削除せず、コンテナを停止させ、また動かしたい時により簡単に起動することができます(私は下画像のようにDocker Desktopを使用してます)。もっといい方法があるかもですが、alwaysにしておくと、コンテナ停止しようとしても、また立ちあがろうとして面倒だったのでこうしてます。

ワークフローを作ろう

スタジオのアプリを作成でワークフローを新規作成します(他にもチャットボットなどを選択して作れます)。

最終的に完成したワークフローは下図のような感じです。

ワークフローではノードを繋げて処理を作っていくのですが、処理の流れも視覚的にわかりやすくていいですよね!

質問分類器

質問に対して、どの分類にするかをLLMで決めてくれます。使用するモデルとどんな分類項目があるかを書くだけなので、非常に簡単に使えます。

面白さを伝える機能

RAG

質問分類器で、この処理に進んだ場合、RAGで回答を行います。「リゼロの面白さをまとめたドキュメント」から質問に関連した情報を検索をかけて取得します。この検索の部分が「知識取得」のノードですね。

「知識取得」を使用する際には事前にナレッジというものを作っておく必要があります。要はベクトル検索・全文検索・ハイブリッド検索などを行うために必要なデータを事前に用意する必要があるということですね。下の画像は作成したナレッジの一部ですが、ネットの記事だけでなく、自分の言葉で「リゼロの面白さ」を伝えるためにドキュメントを自作した部分もあります。

ナレッジ検索で得られた検索結果と質問を下図のテンプレートで組み合わせて、最終的にLLMに質問を投げます。

質問と回答結果を2つ以下に記載してますので、興味のある人は見てみてください。

[結果1]質問:リゼロの面白さがわかりません

「回答」

「リゼロの面白さがわからない」という気持ち、よくわかります! 複雑なストーリー展開で、最初は戸惑う方も多いかもしれませんね。

でも、まさにその**「先が読めない展開」**こそがリゼロ最大の魅力なんです!主人公スバルは、死んだら時間が巻き戻る「死に戻り」の能力を使って、過酷な運命に立ち向かいます。

参考ドキュメントにもあるように、リゼロは、

* **予測不能な展開と絶望感:** スバルの努力が何度も絶望に変わる様は、ハラハラドキドキ! 毎回「次はどうなるの?!」と、続きが気になってしまうはず。
* **笑いとのバランス:** シリアスな展開の中にも、クスッと笑えるシーンが散りばめられています。重すぎないストーリー展開で、見ている側も少し息抜きできますよ。

「死に戻り」を通して成長していくスバルの姿や、個性豊かなヒロインたちとの関係性も見どころです。ぜひ一度、騙されたと思ってリゼロの世界を覗いてみてください! 

どのような処理がそれぞれのノードで行われたかを下図のように確認できるので、非常にわかりやすいですね!

[結果2]質問:スバルのキャラがあまり好きでないのですが、リゼロは何が面白いですか?

この質問は私がよく知人に言われることです。これに対応するために、RAGで使用するナレッジにスバルの性格を受け入れてストーリー全体を面白いと思ってもらえるような情報を格納しています笑
「回答」

確かに、スバルは完璧な主人公ではなく、短所も多いですよね。彼の行動にイライラしてしまう気持ちも分かります。

ですが、リゼロの面白さは**スバルの成長物語**でもあるんです。

彼は元引きこもりで、異世界に来たばかりの頃は未熟で頼りない部分が目立ちます。でも、過酷な運命に翻弄されながらも、**仲間との絆を力に変えて成長していく**姿は、応援したくなる魅力があります。

参考ドキュメントにもあるように、リゼロにはスバル以外にも魅力的な要素がたくさんあります。

* **予測不能なストーリー展開:** スバルの「死に戻り」によって、物語は先の読めない展開を見せます。ハラハラドキドキの展開から目が離せません。
* **魅力的なキャラクター:** エミリアやレムを始め、個性豊かなキャラクターが多数登場します。彼ら/彼女らの過去や想いが丁寧に描かれており、感情移入しやすいのも魅力です。
* **緻密な世界観設定:** 異世界ならではの文化や魔法、そしてそこで生きる人々の生活が細かく描写されています。

スバルの性格が気になる方も、ぜひ一度リゼロを見てみてください。彼の成長物語と、他の魅力的な要素にきっと引き込まれるはずです。

あらすじを教える機能

プロンプト

あらすじを教える機能ではRAGは使用せず、アニメ1期、2期の情報をシステムプロンプトに組み込んで質問に答えてもらうようにしています。

なぜRAGを用いていないかを説明します。RAGを用いるとあらすじの内容がチャンク分割されてしまいます。あらすじではストーリーの流れが重要で、バラバラの情報を検索でくっつけてLLMに回答してもらうよりも、初めから要約した内容をプロンプトに組み込んだ方が、適切なあらすじを回答してくれると思ったからです。当然長すぎる話になってくるとトークン量の問題が出てきますが、アニメ1期・2期の要約くらいであれば全く問題ありません。

[結果3]質問:リゼロの1期2期の内容を忘れちゃったので教えて

「回答」

1期:異世界転移と死に戻り、そしてエミリアとの出会い

異世界転移&死に戻り発動!
主人公の普通の高校生スバルくんが、コンビニ帰りに異世界へ!そこでいきなりピンチ!と思ったら、美しい銀髪のエミリアさんに助けられます。でも、そこからが大変!何度も死に、その度に時間を巻き戻す「死に戻り」の能力に目覚めます。

試練と仲間との出会い!
スバルはエミリアさんのため、そして大切な人たちを守るため、何度も死に戻りを繰り返しながら、様々な困難に立ち向かいます。剣聖ラインハルトや双子のメイド、レムとラムなど個性的な仲間たちとの出会いも!

王選と強大な敵!
エミリアさんは王になるための候補者でした。スバルはエミリアさんを支えるため奔走しますが、魔女教という恐ろしい組織が立ちはだかります。絶望的な状況の中、スバルは仲間たちと共に強大な敵に立ち向かうのでした!

2期:過酷な運命、そして成長…

レムを巡る悲劇!
魔女教の襲撃により、スバルは大切なレムの存在を忘れられてしまうという絶望を味わいます。レムを救うため、スバルは再び過酷な運命に立ち向かうことを決意します。

聖域と試練!
レムを救う鍵を求めて「聖域」へ向かうスバル。そこでエミリアさんの過去や、スバル自身の心の弱さと向き合うことになります。試練を通して、スバルは真の強さを手に入れることができるのでしょうか?

仲間との絆と決意!
スバルは大切な仲間たちを守るため、そして未来を変えるため、自分の能力と向き合い、成長していきます。ロズワールの裏切りや強大な敵との戦いなど、数々の困難を乗り越え、スバルはエミリアさんへの愛を誓います。

ざっくりですが、こんな感じです! 3期ではどんな試練が待ち受けているのか、楽しみですね!

web検索して回答する機能

Difyはいろんなツールと連携できるようになっています。ツールを見てみるとたくさんあることがわかります(下の画像は一部で、まだまだあります)。

今回はweb検索をするためにDuckDuckGo Searchを使用しました。APIキーなども不要だったので、本当にDify上で選択するだけで使えました。DuckDuckGoについてあまり詳しいことは調べてないですが、下の設定で5件の検索結果を取得できていそうです。

あとはこの検索結果を質問と結合してLLMに投げるだけですね。非常に簡単です。

[結果4]質問:ガーフィールってどんなキャラ?

ガーフィールをリゼロのキャラだと判別して、リゼロに関係のある質問に分類されるかどうかが少し心配でしたが、ちゃんとweb検索して答えてくれました。
「回答」

ガーフィールは「Re:ゼロから始める異世界生活」の登場人物で、自称「超最強の聖域の盾」を名乗っています。
10月12日生まれで、地霊の加護を持ち、声優は岡本信彦さん(幼少期は南真由さん)が担当しています。

彼は荒々しく仁義に厚い性格で、強欲の使徒であり獣化も可能です。

参考ドキュメントには、ガーフィールが強欲の使徒になった理由や獣化が可能である理由、強さや能力、名セリフや登場シーンについての記載がないため、お答えできません。

リゼロに関係のない質問には答えない機能

これは関係のない質問に分類されたら、「リゼロに関係のある質問をしてください」という固定文を返すだけです。

[結果5]質問:ワンピースって面白いよね

「回答」

リゼロに関係のある質問をしてください

使用モデル

今更ですが、モデルはGemini1.5FlashとGemini1.5Proを使用しました。これらが回数制限ありでも無料で使えるというのは本当にGoogleに感謝です。
RAGのベクトル検索する部分のみOpenAIのtext-embedding-3-largeを使用しています。
この辺りのAPIキーは各自設定が必要です。

最後に

サクッと作れた割には満足いくものができたと思っています。気づけばDifyの話がしたいのかリゼロの話がしたいのかわからない部分もありましたが、皆さんの参考になれば幸いです。Difyにはまだまだいろんなツールが組み込まれていたり、活用方法がかなりありそうなので、もっといろんなものを作って遊びたいなと思っています。

Discussion