[Dify]ChatFlowでIterationノードを使って論文翻訳作成してみた


## はじめに
論文読む時には何だかんだ翻訳が欲しくなりますよね。翻訳と要約がセットでいい感じに論文が読めるようになると思います。
今回はDifyで要約を作るためのChatFlowを作成したいと思います。

使用しているバージョンは以下になります。
Dify:0.6.9

## 全体像

まずは全体像です。
1. ざっくりURLから論文の内容をJinaReaderで取得します.
2. そしてLLMの入力トークンに収まるように文章を分割します。
3. 分割した内容をLLMに翻訳させる処理をIterationで回します。
4. 最後に文章をくっつけて翻訳文の完成です。
5. JinaReaderで取得している論文の内容をLLMで要約させて完成です。

文章マージのノードを入れていますが、今回は入れているだけで何かに使っているわけではありません。誰かが文章マージどうするんだ？ってなった時のための備忘録で今回は入れています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376115/5d714075-bea3-f36f-ebc0-bf7f9068724b.png)


作成はChatFlowなので気をつけてください！
![スクリーンショット 2024-06-12 23.57.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376115/e2e6abda-8528-5407-63c0-301dcd2e1e0c.png)

では各々のノードでどんな入力、出力を定義しているかみていきましょう。


## 開始ノード
開始ノードでは入力を定義しています。JinaReaderに入れるためのURLを入力にしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376115/abb11b54-c94e-f537-9d72-b78b9a4bcb0e.png)

## JinaReaderノード
開始ノードで入力したURLをJinaReaderノードの入力変数にしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376115/22c9f99a-3581-4eb4-467b-6dc23b2e5d10.png)

## 文章分割ノード
JinaReaderノードの出力である論文の内容を分割していきましょう。今回は５０００字ごとに区切っていきます。
Iterationノードは入力としてArray[String]しか受け取らないので、気をつけて出力を定義しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376115/a4165c65-23ba-52f2-10f7-294d342bd25d.png)

コードはこちら
```python

def main(sentence: str) -> dict:
    chunk_size = 5000
    chunks = []
    start = 0

    while start < len(sentence):
        end = start + chunk_size
        chunk = sentence[start:end]

        chunks.append(chunk)
        start = end

    return {
        "result": chunks,
    }

```

## イテレーションノード

再度言いますが、Iterationノードは入力としてArray[String]しか受け取らないです。
ちゃんと前のノードで出力が定義できていなかったら、Iterationノードの入力変数に出てこないので注意しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376115/9fac78d4-9753-f49b-4a18-09c6f5b0bab1.png)

## 翻訳用LLMノード
Iterationノードでは翻訳LLMを実行します。IterationのItemを入力にして翻訳させてください。プロンプトも載せておきますが適当ですのでちゃんと自分で考えてください。

<details><summary>プロンプト</summary>
次の内容を日本語に翻訳して。翻訳する時には以下の点に注意して下さい。
- その時に無駄な文字、タイトル、図表のキャプションは主力しないで無視すること
- 引用文献一覧に関しては翻訳しないこと
{{#context#}}
</details>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376115/fc4661db-55a1-672e-8b53-9b21ef36e391.png)

続いて翻訳するたびに画面に出力したいのでここで一旦出力のノードを作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376115/dc37a0fd-a096-f992-2846-0b19bea9b83e.png)


## 文章マージノード
Iterationノードの出力もまた配列なので、マージしてあげないといけません。
今回はこのノードの出力はどこかに使うわけではありませんが、使いたい人もいると思うので載せておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376115/5601d200-92e8-1a24-e64e-8174c2de643b.png)

コードはこちら
```python


def main(arg1: list[str]) -> dict:
    concatenated_result = ''.join(arg1)  # arg1のすべての要素を連結
    return {
        "result": concatenated_result,
    }


```


## 要約用LLMノード

最後に要約も出してあげましょう。私はやはり要約欲しいです。
任意で入れてあげてください。
<details><summary>プロンプト</summary>
以下の内容を要約して

{{#context#}}
</details>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376115/3343ca83-bdad-3ece-172a-fd50ec90a5bd.png)
出力ノードを最後に追加して終了！！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376115/69ee8ef5-213d-0965-a4db-5f05368fd721.png)


## 出力結果

一部分スクショ載せますが、めっちゃいい感じです。タイトルまで翻訳されたのは変なのでプロンプトで制御するといいと思います。

![スクリーンショット 2024-06-12 18.22.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376115/53aa29b8-74ca-dab9-c4c2-80d06020559c.png)

## 最後に

今回は翻訳だけですが、チャットの内容によって翻訳だったり、詳しい解説をするようにさせたり、色々とカスタマイズすると便利そうです。