top of page

特許明細書を生成するためのPydanic Outputparser

更新日:3月29日

1.はじめに

  • 機械に明細書のたたき台を生成してもらうべく、LangChainのoutputparserを検討しました。

  • 過去の実験結果から、なるべく生成させる部分を限定すること、出力形式を指定することなどが重要とわかってきたので、とりあえず出力形式を揃えるべく、LangChainのPydanic Parserを使います。


2.工夫点

  • 先行する特許明細書の書き方を見てみたところ、概ね下記のような構造になっていると判断。これをPydanic Parser対応づけていくことにしました。

  • 工夫点としては、明細書もツリー構造になっている部分(ex:【発明の概要】→【発明が解決しようとしている課題】)があるので、それを指定できるようなpydanicの形式にした点と、few shotを意識して出力のexampleを一部指定したみた感じです。

class SummaryOfIinventionList(BaseModel):
    ProblemToBeSolved:List[str] = Field(description="Problem to be solved by the invention.",min_items=2)
    MeansTosolveProblem:List[str] = Field(description="Means to solve the problem..example:MeansTosolveProblem=['〜〜'], EffectOfInvention=['〜〜']",min_items=2)
    EffectOfInvention:List[str] =  Field(description="Effect of the invention.",min_items=2)

class DetailsOfInventionList(BaseModel):
    Example:List[str] = Field(description="A specific method for carrying out the invention will be described in detail.Please explain in detail each part listed in MeansTosolveProblem one by one.",min_items=20)

class BriefDescOfFigureList(BaseModel):
    DescFigure:List[str] = Field(description="A brief description of each drawing necessary for explanation",min_items=1)

class PatentDescription(BaseModel):
    Title:str=Field(description="Name of invention.within 20 characters")
    TechnicalField:str = Field(description="Technical Field of invention.example:TechnicalField='〜〜'")
    BackgroundTechnology:str=Field(description="Background technology of invention")
    SummaryOfIinvention:List[SummaryOfIinventionList] = Field(description="Technical Field of invention.Generate each element of the list in order so that they are connected as sentences. ")
    DetailsOfInvention:List[DetailsOfInventionList] = Field(description="Technical Field of invention..Generate each element of the list in order so that they are connected as sentences. ")
    BriefDescOfFigure:List[BriefDescOfFigureList] =Field(description="Brief Description of Figures")


3.使い方

  • 使い方と出力例はこんな感じです。上で定義したparserは、parser = PydanticOutputParser(pydantic_object=PatentDescription)の部分で使います。

from typing import List,Dict
from langchain.output_parsers import (
    RetryWithErrorOutputParser,
    PydanticOutputParser,
)

from langchain.prompts import PromptTemplate
from langchain_core.pydantic_v1 import BaseModel, Field, validator
from langchain.chat_models import ChatOpenAI

query = "低温定着性、帯電維持性、耐熱保存性に優れたトナーを提供する。樹脂成分と安息香酸金属塩化合物を含有するトナー粒子で、樹脂成分が非晶性ポリエステルと脂肪族結晶性ポリエステルを有する。"

# Set up a parser + inject instructions into the prompt template.
parser = PydanticOutputParser(pydantic_object=PatentDescription)

prompt = PromptTemplate(
    template="""あなたは特許出願のための出願の明細書を作成するプロです。
    ユーザのアイデア(クエリ)をもとに、特許明細書を作成してください。
    日本語で出力してください。\n{format_instructions}\n{query}\n""",
    input_variables=["query"],
    partial_variables={"format_instructions": parser.get_format_instructions()},
)

chain = prompt | model | parser
chain.invoke({"query": query})

PatentDescription(
Title='低温定着可能なトナー', 
TechnicalField='本発明は、印刷機器に用いられるトナーに関し、特に低温定着性、帯電維持性、耐熱保存性に優れたトナーに関する。', 
BackgroundTechnology='従来のトナーは、高い定着温度を必要とすることが多く、エネルギー消費が大きいという問題があった。また、長期保存において帯電性が低下しやすく、使用時に不具合を起こすことがあった。さらに、耐熱性に劣るという問題も存在した。', 

SummaryOfIinvention=[
SummaryOfIinventionList(
ProblemToBeSolved=['低温での定着性を向上させること。', '帯電維持性と耐熱保存性を改善すること。'], 
MeansTosolveProblem=['非晶性ポリエステルと脂肪族結晶性ポリエステルを含む樹脂成分を有するトナー粒子を提供する。', '安息香酸金属塩化合物を樹脂成分に添加することで、帯電維持性と耐熱保存性を向上させる。'], 
EffectOfInvention=['低温定着性に優れたトナーを提供し、エネルギー消費を削減する。', '帯電維持性と耐熱保存性が改善され、長期保存後も品質の劣化が少ないトナーを提供する。']
)
],

DetailsOfInvention=[DetailsOfInventionList(
Example=['トナー粒子は、非晶性ポリエステルと脂肪族結晶性ポリエステルを含む樹脂成分を基材としている。', '非晶性ポリエステルは、低温定着性の向上に寄与する。', '脂肪族結晶性ポリエステルは、帯電維持性と耐熱保存性の向上に寄与する。', 'トナー粒子には、安息香酸金属塩化合物が添加される。', '安息香酸金属塩化合物は、トナー粒子の帯電維持性を向上させる。', '安息香酸金属塩化合物は、トナー粒子の耐熱保存性を向上させる。', 'トナーの製造方法には、混練、粉砕、分級の工程が含まれる。', '非晶性ポリエステルと脂肪族結晶性ポリエステルは、特定の割合で混合される。', '安息香酸金属塩化合物は、トナー粒子の製造工程において、樹脂成分に混合される。', 'トナー粒子は、所定の粒度に調整される。', 'トナー粒子は、特定の熱履歴を有することで、帯電維持性が向上する。', 'トナー粒子は、耐熱性試験において、優れた結果を示す。', 'トナーの使用により、印刷機器のエネルギー消費を削減できる。', 'トナーは、長期保存後も安定した印刷品質を維持する。', 'トナーは、高速印刷においても帯電維持性が保たれる。', 'トナー粒子の表面には、表面処理剤が施されることがある。', '表面処理剤は、トナー粒子の流動性を向上させる。', 'トナー粒子は、特定の色材を含むこともある。', '色材は、印刷物の色再現性を向上させる。', 'トナーの各成分は、環境に配慮した素材を使用することが望ましい。'])],
BriefDescOfFigure=[BriefDescOfFigureList(DescFigure=['図1は、トナー粒子の概略構造を示す断面図である。', '図2は、トナー粒子の製造工程を示すフローチャートである。', '図3は、トナー粒子の帯電維持性を評価するための試験装置の概略図である。', '図4は、トナー粒子の耐熱性を評価するための試験装置の概略図である。'])])

  • 生成の中にRAGを組み込むのと、生成する方向性を何らかの方法で加えていかないといけないな、と検討中です。

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

最新記事

すべて表示

Bình luận


bottom of page