【ChatGPT関連】（Llama を使って）簡単Webページ要約

# <font color=royalblue> はじめに </font>
OpenAIのGPTを使ったチャットボットを簡単に作成できる「LlamaIndex」を用いて、
<font color=royalblue>テンプレート（プロンプト）を使ったWebページの要約を簡単に生成する方法</font>
を整理しました。
モチベーションとして、Webページを読み込んでindexを作成しQueryに直接文字列を指定するサンプルはネット上にありましたが、テンプレートを活用するサンプルがなかったため独自に作成して検証してみました。

この方法を使えばテンプレートに渡すキーワードを変えるだけで様々な処理ができるようになると思います。

なお、動作確認はGoogleコラボを使いGPT3.5で検証しました。

以下に順を追って説明します。


### <font color=royalblue>必要なライブラリィのインストール </font>
``` python
!pip install llama-index
!pip install langchain
!pip install openai
```

### <font color=royalblue>OpenAI APIキーの設定 </font>
払い出したAPIキーを設定します（APIキーの払い出しがされてない場合、払い出し方法は他の記事に任せます）。

``` python
%env OPENAI_API_KEY=APIキーを設定してください
```

### <font color=royalblue>テンプレートの設定 </font>
`langchain`の`PromptTemplate`を使ってテンプレートの設定します（テンプレートは今回のWebページ要約用のサンプルです。キーワードとして`num:生成する要約数`、`action:要約に含めて欲しい観点`を起動時に指定可能にしました）。

``` python
from langchain import PromptTemplate

template = """ このデータの要約を{num}個作成してください。
それぞれの要約は日本語で100文字以上200文字以内で作成してください。　
また、要約には{action}を入れてください。　
"""

prompt = PromptTemplate(
    input_variables=["num", "action"],
    template = template,
)
```

### <font color=royalblue>GPTの環境設定 </font>
デフォルトでは出力トークンが短く出力が途切れてしまう場合があるので、`ServiceContext`を使って出力トークン数を2048に拡大します。

``` python
from llama_index import LLMPredictor, ServiceContext, PromptHelper
from langchain import OpenAI

# define LLM
max_input_size = 4096
num_output = 2048  #2048に拡大
max_chunk_overlap = 20
prompt_helper = PromptHelper(max_input_size, num_output, max_chunk_overlap)
llm_predictor = LLMPredictor(llm=OpenAI(temperature=0, max_tokens=2048))
service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor, prompt_helper=prompt_helper)
```

### <font color=royalblue>Webページを読み込んでindexを作成 </font>
今回は、大谷翔平さんのWikiぺディアの記事を見込んでみます。

https://ja.wikipedia.org/wiki/%E5%A4%A7%E8%B0%B7%E7%BF%94%E5%B9%B3


``` python
from llama_index import GPTSimpleVectorIndex
from llama_index.readers import BeautifulSoupWebReader

documents = BeautifulSoupWebReader().load_data(urls=["https://ja.wikipedia.org/wiki/%E5%A4%A7%E8%B0%B7%E7%BF%94%E5%B9%B3"])
index = GPTSimpleVectorIndex.from_documents(documents,  service_context=service_context) 
```

### <font color=royalblue>要約の実行 </font>
これで準備ができましたので、要約を実行します。
生成する要約数を `num=３`、要約に含めて欲しい観点を `action=経歴や活動内容`として実行してみます。


``` python
answer = index.query(prompt.format(num=3, action="経歴や活動内容"))
print(answer)
```

以下の結果が出力されました。それなりに要約されていると思います。

``` python
1. 大谷翔平は、プロ野球選手であり、現在はMLBのロサンゼルス・エンゼルスに所属しています。2011年以降、歴代の新語・流行語大賞の受賞者に選ばれたこともあります。2020年には、全米最優秀アスリート賞を受賞し、さらには、NPBの最優秀選手、最多勝利、最優秀防御率、最高勝率、MLBのルーキー・オブ・ザ・イヤー、アメリカンリーグMVP、シルバースラッガー賞受賞者など、多くの賞を受賞しています。

2. 大谷翔平は、プロ野球選手として活躍しています。2011年以降、歴代の新語・流行語大賞の受賞者に選ばれたこともあります。その中でも、2020年には「リアル二刀流/ショータイム」が受賞しました。また、2020年には全米最優秀アスリート賞を受賞し、NPBのオールスターゲーム選出選手、オールMLBチーム選出選手、WBSCプレミア12日本代表選手、2015 WBSCプレミア12選手、ワールド・ベースボール・クラシック日本代表選手、ワールド・ベースボール・クラシック優勝選手、2023 ワールド・ベースボール・クラシック選手など、多くの賞を受賞しています。

3. 大谷翔平は、1994年生まれの岩手県出身の野球選手です。プロ野球選手として活躍しており、2011年以降、歴代の新語・流行語大賞の受賞者に選ばれたこともあります。その中でも、2020年には「リアル二刀流/ショータイム」が受賞しました。また、2020年には全米最優秀アスリート賞を受賞し、MLBのロサンゼルス・エンゼルスに所属しています。さらに、スポーツに関する日本のギネス世界記録保持者、野球に関するギネス世界記録保持者、ホリプロ21世紀日本の人物、21世紀のスポーツ選手など、多くの賞を受賞しています。
```

# <font color=royalblue>おわりに</font>
簡単にWebページを読み込んでテンプレートで指示した処理が行えることが確認出来ました。応用として読み込むWebページを変えて色々な選手のサマリを作成したり、テンプレートを変えることで様々な処理が行えると思います。

誤りや認識違いがあればご指摘ください。順次ブラッシュアップしていきます。