TECH BLOG

エルカミーの技術ブログです

【Difyで作るシリーズ 4】 論文を要約し引用数を取得する

はじめに

Difyというサービスを聞いたことがあるけれど、「何ができるかわからない」、「どう使うのかわからない」などの理由で使ったことがない方は多いのではないでしょうか。

そのような方のために、「Dify で何ができるのか?や Dify を使った活用事例」を紹介する記事をシリーズ化していきます。

今回は第4回目で、arXivから特定の論文を要約し、その論文の引用数も取得するワークフローを作成する方法について紹介します。

🙂
この記事の対象者
  • Dify という言葉を聞いたことがあるが、何ができるのかがわからない方
  • Dify を業務に取り入れたいと検討している方
事前準備
  • Dify へのサインアップ
  • OpenAI APIまたはGemini APIのAPIキーの取得
    • Gemini APIの場合
      1. ここにアクセスし、「APIキーを作成」を選択します。
      2. 「新しいプロジェクトでAPIキーを作成」を押します。
      3. APIキーをコピーします。
    • Open AI APIの場合
      • サインアップした後、こちらからAPIキーを作成し、保存します。
  • APIキーのセットアップ
環境
  • Chrome
  • Dify v0.10.2(2024年11月06日時点)

作成するAIアプリの概要

完成イメージ

まずは、今回作成するアプリの完成イメージについてです。

📌
イメージ
  1. 左側の「url」に、対象の論文のURLを入力します。
  2. 右側に論文の引用数と要約が表示されます。
image block

上記のアプリを構築するためにワークフローを作る説明をします。

💡
ワークフローとは

一つ一つの処理を小さなブロック(ノード)としてつなぎ合わせて、一連のプロレスを自動化する機能です。

今回作成するワークフローのDifyの画面です。

image block

このワークフローは、以下のブロックで構成されます。

flowchart LR
	A[開始] --> 1[SEARCH THE WEB]
	1 --> 2[LLM]
	2 --> B[テンプレート]
	A --> C[ID抽出]
	C --> D[URL作成]
	D --> E[HTTPリクエスト]
	E --> F[JSON Parse]
	F --> B
	B --> G[終了]
  1. 開始:要約したい論文のURLを入力するノードです。
  2. SEARCH THE WEB:入力されたURLをもとに、論文の内容を取得します。
  3. LLM:論文の内容を要約します。
  4. ID抽出:URLから論文のIDを抽出します。
  5. URL作成:論文のIDを使って、引用数を取得するためのURLを作ります。
  6. HTTPリクエスト:URLをもとに論文の引用数を取得します。
  7. JSON Parse:HTTPリクエストの結果(JSONデータ)から、論文の引用数だけを取り出します。
  8. テンプレート:出力する形式を指定します。
  9. 終了:結果を出力します。

作業手順

ここからは、ワークフロー構築の手順について説明します。

手順
  1. ワークフローの新規作成
  2. ワークフロー作成画面上での作業
  3. ワークフローの動作確認
1. ワークフローの新規作成
  1. 最初の画面の「最初から作成」を選択します。
    image block
  2. 「ワークフロー」を選択し、「アプリのアイコンと名前」を入力してから「作成する」を押します。
    image block
2. ワークフロー作成画面上での作業

最初に論文を取得し、要約する処理を作ります。

  1. 「開始」ノードを選択します。

    入力フィールドの「フィールドタイプ」を「短文」で選択し、「変数名」と「ラベル名」に任意の名前を入力して「保存」を選択します。

    image block

  2. 「開始」ノードの「+」ボタンを押し、「ツール」の「Search the web」を選択します。
    image block

    「入力変数」の「Question (Query)」の部分に「/(スラッシュ)」を入力し、「開始」の「{x}url」を選択します。

    image block
  3. 「Search the web」ノードの「+」ボタンを押し、「LLM」を選択します。
    image block

    「LLM」ノードを選択し、「コンテキスト」に「開始」の「url」を選択します。

    「SYSTEM」「{x}」ボタンをクリックし、「コンテキスト」を追加します。

    改行し、以下のプロンプトを入力します。

    この文章の内容を要約してください。
    image block
  4. 「開始」ノードの「+」ボタンを押し、「コード」ノードを追加します。

    論文の引用数を取得するためには、まず論文のURL中にある論文のIDを取得する必要があります。

    image block

    「コード」ノードを編集をします。

    「入力変数」の値を削除します。

    「変数名」に「arxiv_url」と入力し、「開始」の「{x}url」を設定します。

    image block

    コードブロックに以下のコードを入力します。

    import re
    
    def main(arxiv_url: str) -> dict:
        pattern = r"(?:arxiv\.org/abs/)?(\d+\.\d+)"
        match = re.search(pattern, arxiv_url)
        if match:
            arxiv_id = match.group(1)
            return {"arxiv_id": arxiv_id}
        else:
            return {"arxiv_id": None}

    ここではPythonで、URL中の論文のIDを抽出する処理を書いています。

    image block

    「出力変数」の「変数名」に「arxiv_id」と入力します。

    image block
  5. 「コード」ノードの「+」ボタンを押して、「コード」を選択します。

    特定の論文の引用数を取得するために、論文のIDを使用してADS APIにアクセスするためのURLを作成します。

    image block

    既定の入力変数を削除し、「変数名」に「arxiv_id」を入力して「ID抽出」の「{x}arxiv_id」を選択します。

    image block

    コードブロックに以下のコードを入力します。

    def generate_url(arxiv_id: str) -> dict:
        url = f"https://api.adsabs.harvard.edu/v1/search/query?q=identifier:arXiv:{arxiv_id}&fl=citation_count"
        return {"url": url}
    
    def main(arxiv_id: str) -> dict:
        return generate_url(arxiv_id)

    「出力変数」に「url」と入力します。

    image block
  6. 「コード」ノードの「+」ボタンを押して、「HTTPリクエスト」ノードを追加します。
    image block

    「API」で「GET」を選択します。

    右の欄で「/」を入力した後、「URLを作成」の「{X}url」を選択します。

    image block

    ADS APIを使用するためのAPIキーを設定します。

    「認証なし」を押し、下記の表のように各項目に値を設定し、「保存」を選択します。

    項目 備考
    認証タイプ(1段目) APIキー
    認証タイプ(2段目) Bearer
    APIキー 任意の値 事前準備で取得したキーを入力します。
    image block

    「ヘッダー」と「パラメータ」の値を下記の表のように設定します。

    項目 キー 備考
    ヘッダー Authorization Bearer
    パラメータ arxiv_id {x}result 「ID抽出」の「{x}result」を選択
    image block

    「タイムアウト」の「接続タイムアウト」と「読み取りタイムアウト」にそれぞれ「15」と入力します。

    image block
  7. 「HTTPリクエスト」ノードを選択し、「+」ボタンを押して「ツール」の「JSON Parse」を選択します。
    image block

    「JSON data」と「JSON filter」の値を下記の表のように設定します。

    項目 備考
    JSON data {x}body 「HTTPリクエスト」の「{x}body」を選択
    JSON filter body["response"]["docs"][0].get("citation_count", 0)
    image block
  8. 「LLM」ノードの「+」ボタンを押し、「テンプレート」を選択します。

    「テンプレート」ノードと「JSON Parse」ノードをつなぎます。

    image block

    「入力変数」のフィールドに、下記の表のように変数名と値を設定します。

    変数名 備考
    text {x}text 「LLM」の「{x}text」を選択
    count {x}text 「JSON Parse」の「{x}text」を選択
    image block

    コードブロックに以下のプロンプトを入力します。

    引用数は{{count}}件です。
    要約した内容は以下の通りです。
    {{ text }}
    image block

  9. 「テンプレート」ノードの「+」ボタンを押し、「終了」を選択します。
    image block

    「出力変数」の「変数名」に「output」と入力し、「テンプレート」の「output」を選択します。

    image block

以上でワークフローが完成しました。

3. ワークフローの動作確認
  1. 「公開する」を選択し、「アプリを実行」を選択します。
    image block

    アプリを実行します。

  2. 右側に論文の引用数と要約が表示されました。
    image block

応用

今回は、DifyのUI(画面)上で論文の引用数と要約が返ってくるものを作成しましたが、Slackと連携することで、チャンネルにURLを入力して出力結果を得ることもできます。

おわりに

今回の記事では、arXivから特定の論文を要約しその論文の引用数も取得するワークフローの作成手順を紹介しました。今後もDifyを利用したアプリの作成手順を紹介していきます。ぜひ引き続きご覧下さい。