top of page
執筆者の写真NISHIO KEI

GPTsで特許を調べてもらう

更新日:3月29日

1.はじめに

  • openAIからGPTsがリリースされました。簡単にいうと自作でchatGPTをカスタムできるものです。



  • 早速、小泉構文を作成するGPTsなど作っていました。





  • 特許でも何か作ってみよう、ということで、パテントファミリーの代表出願(基礎となっている出願)の選定と、代表出願の請求項と他の出願の請求項との差を分析するGPTsを作ってみようと思い、試しました。


2.全体構成


ユーザ---GPTs---Actions(自作API)---CloudFunctions(特許データ取得関数内蔵)

という感じで作りました。



3.コード概要

  • GPTsの部分:ここは比較的簡単で、


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

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

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

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

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

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

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

(2)Actionsの部分にopenapi(※openaiではないです)のschemaを貼り付ける。INPUTはpatent_numberで、OUTPUTはclaim,filing_date,publication_date,statusです。

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

(3)外部APIを作成

  • これは特許データを引っ張ってこれればいいですが、適当に自作してClloudFunctionsで作りました。上記で定義したopenapiのschemaに対応して返してあげます。

  • ハマった部分としては、GPTsからのheaderが不明で、ネット上にあるCloudFunctionsのrequestからのパース(GETやPOSTの受け取り)が上手くいかないので、下記赤字部分を追加した点です。

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)

(4)webBrowsingやCode Interpreterのチェックを外す。

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




  • 最終的にはこんな感じに。Talked toの部分で外部APIを呼び出しています。




  • 代表特許の特定:



・代表特許の請求項とその他特許の請求項との比較



  • 表形式に。ホントは指定したように1行にまとめてほしかったですが、これは今後ということで。



4.最後に

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

  • 一方、細やかに制御(特にアウトプット)したい場合は、LangChainに頼るのがいいなと思いました。

閲覧数:586回0件のコメント

最新記事

すべて表示

Bình luận


bottom of page