1.はじめに
特許分類を言葉で検索してみました。
結構いい感じに出してくれてるので、精度検証に続きます。
2.特許分類のベクトルサーチへ
先日特許調査のために、調査対象と関連する特許分類を探していて、結構めんどいなと感じたのが部分一致検索。特許庁の分類ツールだとそのキーワードが入ってないとヒットしてくれません。
こんな感じ↓
もうちょっと楽に分類を見られないかと思い、ベクトルサーチでやってみることにしました。
embeddingは、e5-largeに対抗できるという話でBGE-M3を使ってみます。
(1)特許分類
3年くらい前に作成したFタームの定義情報を使いました。
こんな感じです。ベクトル化する対象はtree_defで、metadataはipcとdefでよさそうです。
これをBQ⇒dataframeに入れておきます。
(2)ベクトル化とpineconeへ投入
langchainにちょうどよいライブラリがあったので、それを流用させてもらいます。
mb_model = "bge-m3" # @param ["e5-large", "bge-m3"]
#!pip install langchain_community -q
#!pip install sentence_transformers -q
import torch
from langchain_community.embeddings import HuggingFaceBgeEmbeddings
from langchain_community.embeddings import HuggingFaceEmbeddings
device = "cuda" if torch.cuda.is_available() else "cpu"
model_path = "BAAI/bge-m3"
model_kwargs = {"device": device}
encode_kwargs = {"normalize_embeddings": True} # Cosine Similarity
if emb_model == "bge-m3":
embedding = HuggingFaceBgeEmbeddings(
model_name="BAAI/bge-m3",
model_kwargs=model_kwargs,
encode_kwargs=encode_kwargs,
)
else:
embeddings = HuggingFaceEmbeddings(
model_name="intfloat/multilingual-e5-base",
model_kwargs=model_kwargs,
encode_kwargs=encode_kwargs,)
pineconeに投入するにはidとvaluesが必要なので、作成。さらに参照用にmetadataも作っておきます。
import hashlib
def add_metadata(rows):
return {"def":rows["def"] ,"fterm": rows["ipc"]}
def md5enc(text):
return hashlib.md5(text.encode()).hexdigest()
df["id"] = df["ipc"].apply(md5enc)
df["metadata"] = df.apply(add_metadata,axis=1)
pineconeに投入します。テキスト量が多い場合は分割しつつ。
vectorstore = PineconeVectorStore(
index_name=index_name,
embedding=embedding,
pinecone_api_key=PINECONE_API_KEY,
namespace=namespace)
texts = df["tree_def"].tolist()
metadatas = df["metadata"].tolist()
ids = df["id"].tolist()
vectorstore.add_texts(
texts,
metadatas=metadatas,
ids=ids,
#embedding_chunk_size=1000,
#batch_size=64
)
無事入ってくれてますね。
(3)試してみる
試してみます。
その1
query = """
自動運転時の車線変更における警報システム
"""
vectorstore.similarity_search_with_score(query,k=30)
⇒結構いい感じではないでしょうか。
その2
query = """
大規模言語モデル
"""
vectorstore.similarity_search_with_score(query,k=30)
⇒一番高スコアの2C150は玩具であったり、明らかに違う分野がまざっちゃってますね。
3.その他
他の特許分類(IPC,CPC,FI)も作って、分類の候補を上げてもらおうと思います。最終的には検索式作成までやってもらいたいですね。
埋め込みモデルはOSSを使ったので、費用がかかりませんでした。openaiやvertexaiの埋め込みだと結構かかるので、性能が遜色なくなれば、OSSの埋め込みモデル使うのが良さそうです。
Reankerでより精度上げられないか検討します。
今後の精度テストとしては、特許文献の要約・請求項などで検索してみて、実際に付与されているFタームと一致しているかを見るのが良さそうなので、試してみます。
追記:結構便利だったので、streamlitでアプリにしました。
こんな感じです。
お返事いただきありがとうございます。次元数の観点参考になりました。現在の社内がAzure環境ですので、一度text-embedding-3-large試してみようと思います。ありがとうございます。
コメントありがとうございます。
直接的ではないですが、textembedding-gecko-multilingual@001(768次元)、e5-large(1024次元)、text-embedding-3-large(3072次元)で埋め込み表現の性能を比較したことがあります(タスクは、入力文に類似する特許文献の抽出)
text-embedding-3-large(3072次元)の精度が安定して高く優等生でした。
textembedding-gecko-multilingual@001とe5-largeは時々飛び抜けて精度いいときがありますが、極端に精度が低い(関係ない文章が出てしまう)ときがあり、ブレが大きかったです。
vertexaiでは、最近 text-multilingual-embedding-preview-0409が出てましたので試して見てもいいと思います。
知財戦略担当 兼 生成AI活用担当(ともに駆け出し)です。ちょうどIPCで同じことを考えており、python+エクセル+ada002+FAISSで実装、アプリ化しても便利だろうなと思っていた所でとても参考になりました。埋め込みモデルの種類によって出力結果に差は出てくるものでしょうか?差し支えなければ教えて頂けると幸いでございます。