top of page
執筆者の写真NISHIO KEI

Vector store-augmented text generationで特許明細書生成

1.はじめに

  • 明細書の元データを明示して指示することで、生成される文章を欲しいものに近づけられる。


2.経緯

  • 前回は素のGPT-4に特許文章の生成をさせていたけれど、他に方法がないか探していました。このページで、特定のgithubレポジトリから、トピックを指定してブログ記事を生成させる事例が載っていました。

generate_blog_post("environment variables")

  • これを特許文章の生成に応用しよう、というのが今回の目的です。



3.コードなど

最初のほうは、いつものものとほぼ同じ


!pip install langchain
!pip install openai
!pip install chromadb
!pip install tiktoken
!pip install unstructured

  • 生成モデルとembedder指定

import os
os.environ['OPENAI_API_KEY'] ="***"
os.environ['OPENAI_API_BASE']="***"
os.environ['DEPLOYMENT_NAME']="***"
from langchain.chat_models import AzureChatOpenAI
from langchain.llms import AzureOpenAI

BASE_URL = os.environ["OPENAI_API_BASE"]
API_KEY = os.environ["OPENAI_API_KEY"]
DEPLOYMENT_NAME = os.environ["DEPLOYMENT_NAME"]

model = AzureChatOpenAI(
        openai_api_base=BASE_URL,
        openai_api_version="2023-03-15-preview",
        deployment_name=DEPLOYMENT_NAME,
        openai_api_key=API_KEY,
        openai_api_type = "azure",
        temperature=0.0
    )

#embedderも設定しておく
#--必ずchunk_sizeを入れる事。そうしないとembeddoの際にInvalidRequestError: Too many inputs. のエラーが出る
from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings(
    model='***',
    deployment="***",
    chunk_size = 1,
    openai_api_version="2023-03-15-preview",
    openai_api_type = "azure")

  • ここのurlsで指定した文章群が大事で、一番近い文献と、その周辺の文献を指定することで、課題や技術分野が同じ文献に基づいて文章を作成できるようになります。

  • 書き方を真似したい文献も指定しておくといいかもしれません。

from langchain.document_loaders import UnstructuredURLLoader
urls = [
"https://patents.google.com/patent/JP5175989B1/ja",
"https://patents.google.com/patent/JP3128168U/ja",
"https://patents.google.com/patent/JP2006222298A/ja",
"https://patents.google.com/patent/JP2006128555A/ja"         
]
loader = UnstructuredURLLoader(urls=urls)
documents = loader.load()

  • ここの切り方(separator)などは文章に応じて適宜変更でしょうか。google patentsからとってきた場合は、いい具合に\n\nが段落区切りになっているので、使います。

  • このsearch_indexを使って、ほしいトピックに関連する段落を取得してきます。

from langchain.vectorstores import Chroma
from langchain.text_splitter import CharacterTextSplitter

text_splitter = CharacterTextSplitter(
    separator="\n\n",
    chunk_size=1000, 
    chunk_overlap=0)
texts = text_splitter.split_documents(documents)

search_index = Chroma.from_documents(texts, embeddings)


  • ここはほぼ記事を流用しました。generate_blog_post(topic)でほしいtopicを指定して生成してもらいます。

from langchain.chains import LLMChain

prompt_template = """Use the context below to write about {textlen} word patent text about the topic below:
    Context: {context}
    Topic: {topic}
    Patent Text:"""

PROMPT = PromptTemplate(
    template=prompt_template, 
    input_variables=["textlen","context", "topic"],
    max_tokens=1000)


chain = LLMChain(llm=model, prompt=PROMPT)


def generate_patent_text(topic,textlen):
    docs = search_index.similarity_search(topic, k=len(urls))
    print("ソース文:" + docs)
    inputs = [{"textlen":textlen,"context": doc.page_content, "topic": topic} for doc in docs]
    print(chain.apply(inputs))

  • こんな感じ

generate_patent_text("発明の名称","15")

generate_patent_text("要約","400")

generate_patent_text("特許請求の範囲","400")

generate_patent_text("背景技術","400")
generate_patent_text("解決しようとする課題","400")
generate_patent_text("課題を解決するための手段","400")
generate_patent_text("発明の効果","200")
generate_patent_text("発明を実施するための最良の形態","1000")
generate_patent_text("図面の簡単な説明","400")



generate_patent_text("発明の名称","15")

OUTPUT:
[{'text': '本発明は、図面参照に基づく上下反転可能な多方向回転機能を有する技術的範囲内の装置である。'}, {'text': '発明名称: 高密度メッシュタイプゲート電極配置によるオン抵抗及びスイッチング損失低減技術'}, {'text': '平板形状半導体装置の製造方法及びそれを用いた高性能オルタネータの開発に関する特許。'}, {'text': '半導体チップ内パワーMOSFET電極へ金属片接続、超音波エネルギー接合、耐湿性樹脂封止構成。'}]


generate_patent_text("課題","100")

OUTPUT:
[{'text': '本発明は、太陽電池用端子箱のダイオード素子装置に関するものであり、特に組立作業性、放熱性に優れ、小型化が可能な太陽電池用端子箱のダイオード素子装置を提供することを課題とする。従来の太陽電池用端子箱のダイオード素子装置は、組立作業性や放熱性に問題があり、小型化が困難であった。本発明は、この問題点に着目し、組立作業性、放熱性に優れた構造を採用することで、小型化が可能な太陽電池用端子箱のダイオード素子装置を実現する。これにより、太陽電池システムの効率向上や設置スペースの削減が期待できる。'}]




4.気づいた点


  • 指定したソースをそのまま出してしまう例があった。

  • 背景技術の文献番号がでたらめに出なくなったので良かったです(素のGPTではここは無理だった)。ソースを指定しているので、その中から選んでいるためでした。

  • 生成に影響する各項目のつながりはLangChainのmemoryなどで保持していければです。これは今後の課題です。

  • やたら時間がかかりました。これは要修正でした。

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

最新記事

すべて表示

Comentários


bottom of page