GPTsで特許調査をしてみた

この記事は[知財系 もっと Advent Calendar 2023](https://adventar.org/calendars/8866)の12/8の記事です。

# 1. 最初に
* openAIからGPTsがリリースされました。
* 早速、小泉構文を作って楽しんでましたが、特許でも何か作ってみよう、ということで作成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385220/8ab497d8-273b-b71f-53f4-0b5995c6ba5c.png)


# 2. 作ったもの
* 丁度どうしようかと悩んでいた、パテントファミリーの代表出願（基礎となっている出願）の選定と、代表出願の請求項と他の出願の請求項との差を分析するものにしました。
* パテントファミリーの請求項の差分を見ていくのって結構めんどうなのです。各国で権利化するために微妙に表現変わっていたり。文字列（の違い）だけならいいけど、同じような表現でも概念などで違っていたりすると一気に大変に。
* これを解決してもらおうと思います。

* 構成はこんな感じです。
ユーザ---GPTs---Actions---CloudFunctions（特許データ取得用の自作API）


3.コードなど
１． GPTsの部分：ここは比較的簡単で、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385220/14beab7d-8a1d-c904-b9e6-d9308b190820.png)

（１）Instructionsの部分
* Instructionsはこんな感じです。アウトプットはmarkdownの表形式で指定するとちゃんと認識してくれました。エクセルのセルをコピペだとoutputが不安定でした。

```text
あなたは特許調査のプロです。
深呼吸して、ステップバイステップで実行してください。

出願日、公開日、ステータス、特許請求の範囲の情報は、Actionsに登録したhttps://********/get-claim1で取得してください。パラメータは "patent_number" です。

STEP1：特許情報の抽出
ユーザから特許番号（patent_number）のリストを渡されたときに、Actionsの外部APIを使って、それぞの特許番号に対応する特許情報を抽出してください。抽出する情報は、出願日（filing_date）、公開日(publication_date)、ステータス(status）、特許請求の範囲（claims）です。

STEP2：代表特許の特定
代表特許を特定してください。代表特許とは、調べた特許の中で、優先日（priority date）か出願日（filing date）が最も古いものです。もし優先日や出願日が同じ場合は、特許請求項（claims）１の文字数が少ない方を代表特許にしてください。

STEP3：代表特許とその他特許との比較
代表特許の請求項１と、その他の特許たちの請求項１とを比較してください。
比較した結果、その他の特許それぞれについて、代表特許の請求項１の差分となっている構成・部分を抽出してください。

STEP4：表形式にまとめる
最終的な出力は以下の例のように、表形式にしてください。
表形式の例：
|公報番号(当該公報へのハイパーリンク付き)|公開日|ステータス(特許化済、申請済、審査中など)
 ※-はステータス情報取れなかったもの|カテゴリー|特許請求範囲（請求項１）|特許内容のサマリー|
|:----|:----|:----|:----|:----|:----|
|US20230259579A1|2023/08/17|US20230259579A1：出願中
EP4220501A1：出願中
|NNの計算量方法（要約）|1. 有向グラフの実行中に実行される、コンピュータで実装される方法であって、第１のデータセットの第１の要約を生成し、第１のデータセットは第１の複合計算の入力である。第１の要約を使用して第１の簡略化された複合計算を実行して、第１の簡略化された出力を生成するステップであって、第１の簡略化された複合計算は第１の複合計算を簡略化したものである。第１の簡略化された出力を使用して第２の簡略化された複合計算を実行して、第２の簡略化された出力を生成するステップであって、第２の簡略化された出力は予測子であり、第２の簡略化された複合計算は第２の複合計算の簡略化であり、ここで、第１の複合計算と第２の複合計算は両方とも有向グラフの複雑な計算の一部である。第２の複合計算は、有向グラフ内の第１の複合計算に依存する。そして複素計算の実行中に、第２の複合計算からのコンポーネント計算のセットを抑制し、第２の複合計算からのコンポーネント計算のセットが、予測子に基づいて抑制のために選択される。|●メインクレームのポイント：入力データの簡略化によって、ANN（ニューラルネットワーク） の計算量を削減する。
●代表出願とファミリー出願との差：
EP4220501A1:なし|
```

---

（２）Actionsの部分
openapiのschemaを貼り付けます。INPUTはpatent_numberで、OUTPUTはclaim,filing_date,publication_date,statusです。

```python
openapi: 3.0.0
servers:
  - url: https://****
info:
  description: Useful for searching patents and claims.
  version: "1.0.0"
  title: Simple Patent Search API
  contact:
    email: you@your-company.com
  license:
    name: MIT
    url: 'https://opensource.org/license/mit/'
tags:
  - name: admins
    description: Secured Admin-only calls
  - name: developers
    description: Operations available to regular developers
paths:
  /get-claim1:
    get:
      operationId: getPatentInformation
      summary: Retrieve a list of patents information
      parameters:
        - name: patent_number
          in: query
          required: true
          description: The search text to find patents
          schema:
            type: string
          example: "US9876543B2"
      responses:
        '200':
          description: A JSON object containing patent details
          content:
            application/json:
              schema:
                type: object
                additionalProperties: 
                  type: object
                  properties:
                    claims:
                      type: array
                      items:
                        type: string
                      description: Claims of the patent
                      example: 2010-01-01
                    filing_date:
                      type: string
                      format: date
                      description: The filing date of the patent
                    publication_date:
                      type: string
                      format: date
                      description: The publication_date date of the patent
                      example: 2011-06-01
                    status:
                      type: string
                      description: status of the patent
                      example: Pending
```
---
（３）外部APIを作成
* これは特許データを引っ張ってこれればいいですが、適当に自作してCloudFunctionsで作りました。上記で定義したopenapiのschemaに対応して返してあげます。
* ハマった部分としては、GPTsからのheaderが不明で、ネット上にあるCloudFunctionsのrequestからのパース（GETやPOSTの受け取り）が上手くいかないので、下記request_args.get('patent_number'**,)部分を追加した点です。

```python
def hello_http(request):
    """HTTP Cloud Function.
    Args:
        request (flask.Request): The request object.
        <https://flask.palletsprojects.com/en/1.1.x/api/#incoming-request-data>
    Returns:
        The response text, or any set of values that can be turned into a
        Response object using `make_response`
        <https://flask.palletsprojects.com/en/1.1.x/api/#flask.make_response>.
    """
    request_json = request.get_json(silent=True)
    request_args = request.args


    if request_json and 'patent_number' in request_json:
        num = request_json['patent_number']
    elif request_args and 'patent_number' in request_args:
        num = request_args['patent_number']
    else:
        num = request_args.get('patent_number', "US9876543B2")

　　・・・・以下特許データ取得の本文部分

　　res_dict = {}
    res_dict[num] = {}
    res_dict[num]['claims'] = claims
    res_dict[num]['filing_date'] = filing_date
    res_dict[num]['publication_date'] = publication_date
    res_dict[num]['status'] = status
    
    headers = {
       ・・・・
    }

    alld = json.dumps(res_dict)
    
    return (alld, 200, headers)
```

---
（４）webBrowsingやCode Interpreterのチェックを外します。
* これらにチェックを入れておくと悪さをする（余計なウェブ検索を行ったり、自作でrequestで情報をとってこようとして失敗する）ことが多かったので、情報とれるのは指定した外部APIのみにしました。

---
* 試してみたもの：Talked toの部分で外部APIを呼び出しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385220/99269abc-e6b3-3725-d5d9-63bafa51d5d3.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385220/c461332a-507c-98d7-1f37-4acd6ea46e3a.png)
---
* STEP2の代表特許の特定：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385220/275cab17-7d06-fd6b-39d0-c4cc6601cc3c.png)

---
* 代表特許の請求項とその他特許の請求項との比較
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385220/48e3bffa-44a2-80d6-98bc-c356dcb079ce.png)

---
* 表形式に。ホントは指定したように１行にまとめてほしかったですが、これは今後ということで。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385220/782d1370-1fb4-010a-08d2-ced211c55162.png)


# 4．最後に
* ほんとは自分でプログラム書かなきゃいけない部分を、GPTsが軽く飛び越えてやりたいことを実現してくれるのは爽快でした！

* 一方、細やかに制御（特にアウトプットや、クエリを投げる際のMultiQuery、中間のoutputに応じた場合分け）したい場合は、LangChainに頼るのがいいなと思いました。