この記事は知財系 もっと Advent Calendar 2023の12/8の記事です。
1. 最初に
- openAIからGPTsがリリースされました。
- 早速、小泉構文を作って楽しんでましたが、特許でも何か作ってみよう、ということで作成しました。
2. 作ったもの
-
丁度どうしようかと悩んでいた、パテントファミリーの代表出願(基礎となっている出願)の選定と、代表出願の請求項と他の出願の請求項との差を分析するものにしました。
-
パテントファミリーの請求項の差分を見ていくのって結構めんどうなのです。各国で権利化するために微妙に表現変わっていたり。文字列(の違い)だけならいいけど、同じような表現でも概念などで違っていたりすると一気に大変に。
-
これを解決してもらおうと思います。
-
構成はこんな感じです。
ユーザ---GPTs---Actions---CloudFunctions(特許データ取得用の自作API)
(1)Instructionsの部分
- 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の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を作成
- これは特許データを引っ張ってこれればいいですが、適当に自作してCloudFunctionsで作りました。上記で定義したopenapiのschemaに対応して返してあげます。
- ハマった部分としては、GPTsからのheaderが不明で、ネット上にあるCloudFunctionsのrequestからのパース(GETやPOSTの受け取り)が上手くいかないので、下記request_args.get('patent_number'**,)部分を追加した点です。
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のみにしました。
4.最後に
-
ほんとは自分でプログラム書かなきゃいけない部分を、GPTsが軽く飛び越えてやりたいことを実現してくれるのは爽快でした!
-
一方、細やかに制御(特にアウトプットや、クエリを投げる際のMultiQuery、中間のoutputに応じた場合分け)したい場合は、LangChainに頼るのがいいなと思いました。