1.はじめに
特許データべースは通常SQLで検索します。
ex:キヤノン株式会社の特許件数を調べる。
SELECT COUNT(*) FROM {データベース} WHERE applicant_name = "キヤノン株式会社"
LangChain+LLMでこれを言葉で検索できるようなので、試してみました。
2.スクリプト
まずはおきまりのもの。
!pip install openai --upgrade
!pip install langchain --upgrade
import os
os.environ["OPENAI_API_KEY"] = "****"
from langchain.agents import create_sql_agent
from langchain.agents.agent_toolkits import SQLDatabaseToolkit
from langchain.sql_database import SQLDatabase
from langchain.llms.openai import OpenAI
from langchain.agents import AgentExecutor
LangChainのサイトを参照しつつ、BigQueryから取り出した特許データを、sqliteに投入します。
import sys
import pandas as pd
import sqlite3
BigQueryからデータ取得
from google.cloud import bigquery
project_id="*****"
client = bigquery.Client(project=project_id)
# 実行するクエリ
query2 = """
SELECT app_num as application_number
,acai_app_dt as application_date
, H_APPLICANT as applicant_name
,FTdef,wipo_clas
FROM {projectid}.{dataset}.{table}
"""
query_job = client.query(query2)
rows = query_job.result()
df = rows.to_dataframe()
こんな感じで出せます。2000年以降の出願で約700万行
これをsqliteに変換。pandasではとても簡単に変換できます。
file_sqlite3 = "./patentdata.db"
conn = sqlite3.connect(file_sqlite3)
df.to_sql('patentdata',conn,if_exists='append',index=None)
conn.close()
最後にAgentを作成。これに言葉で問い合わせできます。
#@title Agent作成
db = SQLDatabase.from_uri("sqlite:///patentdata.db")
toolkit = SQLDatabaseToolkit(db=db)
agent_executor = create_sql_agent(
llm=OpenAI(temperature=0),
toolkit=toolkit,
verbose=True
)
3.試し
例1:
agent_executor.run("""
キヤノン株式会社の2020年の出願件数を教えてください。
出願日情報はapplication_dateに入っています。
データは日本語がはいっています。
半角と全角で出願人名を調べてください。
""")
Agentoが考え出したクエリです。
SELECT COUNT(*) FROM patentdata WHERE applicant_name LIKE '%キヤノン%' AND application_date LIKE '2020%' The query looks correct, I should execute it
例2:
agent_executor.run("""
出願人がキヤノン株式会社であって、かつ生物材料分析に関する出願を検索してレコード件数を教えてください。
技術情報はwipo_clasに入っています。
データは日本語がはいっています。
半角と全角で出願人名を調べてください。
""")
Agentoが考え出したクエリです。
SELECT COUNT(*) FROM patentdata WHERE applicant_name LIKE '%キヤノン株式会社%' AND wipo_clas = '生物材料分析'
・・・
Final Answer: 181件
例3:
agent_executor.run("""
出願件数上位10位の出願人とその出願件数を教えてください。
""")
> Finished chain.
キヤノン株式会社は171176件、パナソニックホールディングス株式会社は155199件、トヨタ自動車株式会社は121813件、株式会社東芝は111129件、セイコーエプソン株式会社は109875件、三菱電機株式会社は104369件、株式会社リコーは97926件、ソニーグループ株式会社は79518件、シャープ株式会社は79224件、株式会社デンソーは68798件の出願件数で上位10位の出願人です
Agentが考えたクエリです。
SELECT applicant_name, COUNT(application_number) AS application_count FROM patentdata GROUP BY applicant_name ORDER BY application_count DESC LIMIT 10;
結構いけますね!テキストデータもAgent経由で検索できるようにすれば、いい感じの応答システムにできそうです。
チャットボットにもしてみました。サイト右下をご覧ください(作成中)。
Comments