watsonx.ai と langchain を使用して、長めの文章を要約してみた

## 初めに

watsonx.ai においても、他のLLMと同様に、Tokenの制限があり、長い文章だとToken不足で正常に要約できない場合がある。
そこで、LangChainのSummarization（Map-Reduce)機能を使用して、長めの文章の要約をためしてみました。

※LangChian:ChatGPT等のLLMを用いたアプリケーション開発を効率的に行うためのライブラリ
https://www.langchain.com

※Map-Reduceによる要約
文章をいくつかに分割して、分割した単位で、LLMで要約を実行。分割してできた要約結果を結合し、
再度LLMで要約を実施。最終的なアウトプットとなる。
https://python.langchain.com/docs/use_cases/summarization


## 実行例
要約に使用する文章は、WikipediaでIBMの項目を抜粋し、使用しました。
実装の内容はコメントをご参照ください。
※Wikipedia(IBM) https://ja.wikipedia.org/wiki/IBM

[スクリプト]
```summary2.py
# import modules
from ibm_watson_machine_learning.foundation_models import Model
from ibm_watson_machine_learning.metanames import GenTextParamsMetaNames as GenParams
from ibm_watson_machine_learning.foundation_models.utils.enums import ModelTypes, DecodingMethods
from ibm_watson_machine_learning.foundation_models.extensions.langchain import WatsonxLLM
from langchain.text_splitter import CharacterTextSplitter
from langchain.docstore.document import Document
from langchain.prompts import PromptTemplate
from langchain.chains.summarize import load_summarize_chain

# create model
generate_params = {
    GenParams.DECODING_METHOD: "greedy",
    GenParams.MAX_NEW_TOKENS: 500,
    GenParams.REPETITION_PENALTY: 1
}

model = Model(
    model_id=ModelTypes.MPT_7B_INSTRUCT2,
    params=generate_params,
    credentials={
        "apikey": "<apiKey>",    #<apiKey>は実環境の値に置き換えてください
        "url": "https://us-south.ml.cloud.ibm.com"
    },
    project_id="<projectId>"　　　#<peojectId>は実環境の値に置き換えてください
    )

# WatsonxLLMでラッピングすることにより、LangChainのmodelとして使用することが可能です。
custom_llm = WatsonxLLM(model=model)

# Original Text
text = """
IBM（アイビーエム、正式名: International Business Machines Corporation）は、アメリカ合衆国ニューヨーク州アーモンクに本社を置くテクノロジー関連企業。世界170か国以上で事業を展開する典型的な多国籍企業であり、世界最大手規模のIT企業。IBMの愛称はビッグブルー、IBM社員の愛称はIBMer。行動指針は、「お客様の成功に全力を尽くす」「私たち、そして世界に価値あるイノベーション」「あらゆる関係における信頼と一人ひとりの責任」。社員への教育理念は、「教育に飽和点はない」。社員の文化として、何ものにもとらわれず「野鴨」、「THINK」などがあり、これらは創業時から100年以上続いている。
IBMは1911年にC-T-Rとして創立され、特に1960年代以降はコンピュータ市場で圧倒的な影響力を持ったが、1990年代以降はコンサルティングを含めたサービスとソフトウェア中心の事業に舵を切り、2010年代頃にはクラウドコンピューティングとコグニティブコンピューティングを提供する企業と自己定義している。以降も、レッドハットの巨額買収（2019）やキンドリルのスピンオフ（2020）等で絶えず事業を組み替え、近年は、プラットフォームを中心とするハイブリッドクラウドやAI、ソフトウェア、コンサルティング事業をコア事業としている。IBMは企業別特許取得数で29年連続一位を保持してきた。2022年現在、アメリカ合衆国の代表的株価指数とされるダウ平均株価を構成する30銘柄のうちの一社である。
事業内容はコンピュータ関連のサービスおよびコンサルティングの提供と、ソフトウェア、ハードウェアの開発・製造・販売・保守、およびそれらに伴うファイナンシング、メインフレームコンピュータからナノテクノロジーに至る分野でサービスを提供している。
IBMは研究機関としても有名でもある、2016年時点では米国特許取得数が23年連続の1位となった。IBMによる発明はDRAM、ハードディスク、フロッピーディスク、磁気ストライプカード、リレーショナルデータベース（RDB）、SQLプログラミング言語、バーコード、現金自動預け払い機（ATM）などがある。
IBMは既存のコモディティ化した市場を脱出し、高付加価値な収益性の高い市場に着目することで、事業構成を絶えず組み替えている。例えばプリンタ事業をLexmarkに分社し（1991年に）、レノボへのパーソナルコンピュータ（ブランド、ThinkPadやNetVistaなど）およびx86ベースのサーバー事業を売却（2005年と2014年）。またファブレス化として2014年にIBMのグローバルな商用半導体技術事業を米GLOBALFOUNDRIESに工場、技術者、テクノロジー知的財産だけではなく、現金15億ドルまでも付けて譲渡。2021年には成長分野のクラウドとAIに集中するため、売り上げの四分の一を占めるITインフラの保守・更新事業を新会社名はキンドリルとしてスピンオフ。一方でPwCコンサルティング（2002年）、SPSS（2009年）、Weather Company（2016年）などの企業を買収している。
製品やロゴの色から本国アメリカでは「Big Blue」の愛称で呼ばれている。これに由来してIBMのプロジェクトには「Blue」を冠するものが多く、広告などのイメージカラーになっている。IBM社員はIBMの価値観を体現する者として、IBMerという呼称を用いている。ダウ平均株価の銘柄に含まれる30社のうちの1社であり、2016年時点で約38万人の従業員数がいる世界最大級の規模の企業となっている。基礎科学の研究にも力を入れワトソン研究所やチューリッヒ研究所からはノーベル賞受賞者を輩出。IBM社員から5人のノーベル賞、6人のチューリング賞、10人のアメリカ国家技術賞、5人のアメリカ国家科学賞の受賞者を輩出している。
IBMは企業別特許取得数で長年にわたり一位を保持してきており、2022年にサムスン電子へ一位の座を譲るまで、連続一位取得記録は29年間続いた。IBMは、2020年以降特許に注力しない方針に転換していた旨の声明を出している。
元CEOのジニー・ロメッティは、米Fortune誌が選ぶ「ビジネス界で最もパワフルな女性」 の一人として長年ランクインしている。
"""

# split text
# 分割した文書に対して要約ができるように、元の文書を分割します。
text_splitter = CharacterTextSplitter(separator="。", chunk_size=500, chunk_overlap=0)
texts = text_splitter.split_text(text)
docs = [Document(page_content=t) for t in texts]


# Define Prompt Template
# 要約指示を出すためのPromptを定義します。
template = """
次の文章を日本語で要約してください。

文章：
{text}

要約：
"""

PROMPT = PromptTemplate(
    input_variables=["text"],
    template=template,
)

# Summarize
# load_summarize_chainで要約処理のChain（処理の流れ）を定義し、
# そのChainを実行することにより、要約作業が行われる。

chain = load_summarize_chain(custom_llm, chain_type="map_reduce", map_prompt=PROMPT, combine_prompt=PROMPT, verbose=False)
result = chain.run(docs)
print(result)
```

[実行結果]
```
$ python summray2.py

IBMは、コンピュータの開発・販売を中心とした企業であったが、コンピュータ市場で圧倒的な影響力を持った1960年代以降に、サービスやソフトウェアの事業に舵を切り、2010年代頃にはクラウドコンピューティングやコグニティブコンピューティングを提供する企業と自己定義している。以降も、レッドハットの巨額買収やキンドリルのスピンオフ等で組み替え、近年は、プラットフォームを中心とするハイブリッドクラウドやAI、ソフトウェア、コンサルティング事業をコア事業としている。IBMは企業別特許取得数で29年連続一位を保持してきた。2022年現在、アメリカ合衆国の代表的株価指数とされるダウ平均株価を構成する30銘柄のうちの一社である
```