Difyワークフロー Google Patent で特許検索して結果を要約してSlackに通知する

はじめに

Difyで作成したワークフローの紹介です。

  1. 任意のキーワードを入力します。
  2. Google patentで特許検索します。
  3. 100件検索したうちの一件をランダムに選択します。
  4. 検索結果をgpt-5-nanoで要約します。
  5. Slackに結果を通知します。

GASを使って定期自動実行することで、毎朝決まった時間に興味があるキーワードの特許がランダムに配信されるようになります。

著者プロフィール

経営コンサルタントの国家資格:中小企業診断士かつ現役技術者の小林隼人です。生成AIを活用して創業や中小企業経営の支援をしております。
詳しいプロフィールはこちら

DSGは下記からダウンロードできます。

GASによる自動化は、下記に書いてありますのでご参照ください。

ワークフロー紹介

開始

シンプルにユーザーからの「query」を受け取るだけです。

コード実行

ちょっと力技ですが、SerpAPIのGooglePatentAPIをpythonから実行して結果を取得します。

APIキーは環境変数から受け取るように設定しています。出力は辞書形式(Dict)で出力されます。そのため出力変数の種類は「object」で設定しています。

中身のpythonコードはこんな感じです。生成AI(Gemini 2.5) を使用してvibe codingしてもらいました。

import json
import requests
import random

def main(query: str, SERPAPI_API_KEY: str) -> dict:
    api_key = SERPAPI_API_KEY
    if not api_key:
        return {'result': {'error': 'SERPAPI_API_KEY environment variable not set'}}

    # APIリクエストのパラメータを設定
    # requestsライブラリが自動でURLエンコードしてくれるので、自前の関数は不要
    params = {
        'engine': 'google_patents',
        'q': query,
        'num': 100,
        'api_key': api_key
    }
    
    url = 'https://serpapi.com/search.json'

    try:
        # requests.getを使ってAPIにリクエストを送信
        response = requests.get(url, params=params)
        response.raise_for_status()  # 200番台以外のステータスコードの場合に例外を発生させる
        data = response.json()  # レスポンスをJSONとして直接パース
    except requests.exceptions.RequestException as e:
        return {'result': {'error': 'Failed to execute API request', 'exception': str(e)}}
    except json.JSONDecodeError as e:
        return {'result': {'error': 'Failed to parse API response', 'exception': str(e)}}

    results = data.get('organic_results', [])

    if not results:
        return {'result': {'error': 'No results found for the given query'}}

    top_slice = results[:100]
    chosen = random.choice(top_slice)

    info = {
        'title': chosen.get('title'),
        'publication_number': chosen.get('publication_number'),
        'assignee': chosen.get('assignee'),
        'inventor': chosen.get('inventor'),
        'patent_link': chosen.get('patent_link'),
        'Snippet': chosen.get('snippet', "")
    }

    return {'result': info}

テンプレート

Pythonからの出力がDict形式でそのままでは利用しづらいので、テンプレートの機能で文字列に変換します。

LLM

gpt-5-nanoを使用して回答を処理します。

タイトルとスニペットだけ日本語に翻訳する、というタスクをお願いしています。

gpt-5-nanoになってから指示追従性が上がって、細かい指示に忠実に従うようになりました。その分あいまいな指示ではなく、明確に指示を与える必要があります。

システムプロンプト

入力として、Google Patentで取得した特許情報が与えられるので、

titleとsnippetのみ日本語に翻訳して出力してください。

ユーザープロンプト

#出力

タイトル:(’title’を日本語に翻訳して出力)

出願者:(‘assignee’をそのまま出力)

発明者(‘inventor’をそのまま出力)

リンク(‘link’をそのまま出力)

スニペット(‘snippet’を日本語に翻訳して出力)

Slack incoming webhook

Slackに投稿します。送信先は環境変数に入れてあります。

終了

そのままLLMの出力を使っています。

終わりに

GAS(Google App Script)を使って定期的に自動実行させるとより良いと思います。

コメント

タイトルとURLをコピーしました