Llama2-70b-chat をAPI利用して、簡単にLLMを体験してみよう

# はじめに
本記事は、Llama2 のチャットボットをAPI利用して動作させるまでに必要なことをまとめたものである。動作させるまでを記載した記事であり、その後の詳細な利用法等については記していない点を留意してほしい。

# 背景
個人的に Llama2 に興味があり、チャットボットをAPI利用したプログラムを組む機会があった。かつ、Qiita にAPI利用についてをまとめた記事がなかったため、本記事を投稿するに至った。
後述しているが、Llama2の利点に、オープンソースでモデルが公開されているため、API料金がかからないという点がある。しかし、今回はあくまでも「簡単に」ということで、API利用で低メモリのPCでもサクッと動かすことを目的としている。

# 環境
OS: Windows 10
Ubuntu: 22.04
Python: 3.7.10

Docker で Ubuntu 環境を構築し、実行している。

# Llama2 についての簡単な説明
（以下、プログラムだけ知りたいという方は読み飛ばして構わない。）
Llama2 とは、Meta社 (旧Facebook社) が2023年7月18日にリリースした、商用利用可能な LLM（大規模言語モデル） のこと。Llama2-70b-chat は、その中でも、パラメーター数が70B(70Billion、すなわち700億)のチャットボットである。ちなみに、パラメーター数が異なる 7B/13B の計3つで公開されている。
Huggingface 等にモデルが公開されており、API利用による料金がかからず、ファインチューニング等もできるが、今回は、replicate のモデルでの API通信を行うことを目的としている。
Llama2 の注目点としては、モデルが公開されていてかつ商用利用可能であり、GPT-3.5と同等の性能を誇っているという点である。これによって、追加学習させることで質の良いモデルを事業に取り入れることが可能となっている。

# 準備
まず注意すべき点として、ある一定期間中、一定のトークン数までは無料だが、そのトークン数を超える場合は1トークンごとに料金が発生する。私がこのプログラムを動かすまでにクレジットカード等を入力する必要がなく、請求されることはない（おそらく上限を超えた場合は出力されなくなる）ため、詳細は特に明記しない。

追記：
上記を確認するため、短時間にリクエストを多数送って試したところ、以下のようなエラーが発生して利用できなくなった。

```
replicate.exceptions.ReplicateError: You have reached the free time limit. To continue using Replicate, set up billing at https://replicate.com/account/billing#billing.
```

ということで、結論としては、「想定外の請求を突然されることはない」となった。

1. `pip install replicate` でパッケージインストール 
Replicateというサイトで公開されているモデルを利用しているため、`pip install replicate` のコマンドを実行してパッケージをインストールする必要がある。

2. replicate でのサインイン（要 GitHub アカウント）
その後、replicate にサインインが必要。サインインには、GitHub のアカウントが必要である。以下のリンクからサインインすることができる。
[replicate サインインページ（公式）](https://replicate.com/signin?next=/docs)

3. `export REPLICATE_API_TOKEN=<トークン>` で環境変数を変更
サインイン後、以下のページの 'Next, copy your API token and authenticate by setting it as an environment variable:' でAPIトークンの環境変数を変更するコマンドをコピペする。コマンドの状態でコピーできるため、欄の右をクリックし、ペーストするだけで実行できる。
[replicae APIキー入手ページ（公式）](https://replicate.com/replicate/llama-2-70b-chat/api)

# プログラムの内容

```
import replicate

output = replicate.run(
    "replicate/llama-2-70b-chat:2c1608e18606fad2812020dc541930f2d0495ce32eee50074220b87300bc16e1",
    input={"prompt": '<ここにプロンプトを書く。英語推奨。>'}
)
output_list = list(output)
output_str = "".join(output_list)
print(output_str)
```

ソースコードは上記のようになっている。API利用なので、ソースコードはかなり短い。故に簡単。2つに分けて説明する。

```
import replicate

output = replicate.run(
    "replicate/llama-2-70b-chat:2c1608e18606fad2812020dc541930f2d0495ce32eee50074220b87300bc16e1",
    input={"prompt": '<ここにプロンプトを書く。英語推奨。>'}
)
```
まず、replicate をインポート。次にreplicate にある、llama-2-70b-chat モデルを使うことを明記している。
prompt の箇所に、入力を書く。イメージとして、ChatGPT に書くものをそのまま書いてよい。ただし、私が実行した際は、出力が全て英語となっていた。日本語で出力するように記述しても英語だったが、入力として日本語は許容されており、文脈全体を通して違和感なく解釈されていたため、出力を日本語訳するとよい。しかし、日本語で全て書くよりも、英語で書いた方が満足のいく出力が得られた。

```
output_list = list(output)
output_str = "".join(output_list)
print(output_str)
```
この箇所は必須ではないが、見やすさのために加えている。
出力が一文字ずつであるため、Python の print 文だと、その都度改行されてしまい、非常に見づらい。そのため、出力をリストとして格納し、文字をつなげた変数 output_str に加え、最後に output_str を出力することで、改行されていないものをターミナルに出力する、という流れ。

# おわりに
非常に簡単であったことがソースコードの短さから感じられたと思う。
大規模モデルを低メモリPCでも、難しいことなしに体験できることがAPI利用の魅力。「LLMをプログラム上で使ってみたいけどスペックが足りない、でもお試しでお金をかけるのもなあ」という方に非常におすすめである。

# 参考文献
- [replicate / llama-2-70b-chat (公式)](https://replicate.com/replicate/llama-2-70b-chat)
- [Meta社の言語モデル『Llama 2』は商用利用可能なAI！その特徴を解説](https://xrcloud.jp/blog/articles/business/11147/#:~:text=%E3%82%92%E6%9E%9C%E3%81%9F%E3%81%97%E3%81%BE%E3%81%99%E3%80%82-,%7C%E3%80%8ELlama%202%E3%80%8F%E3%81%AE%E7%89%B9%E5%BE%B4,%E5%8F%AF%E8%83%BD%E3%80%8D%E3%81%8C%E6%8C%99%E3%81%92%E3%82%89%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82)
- [Metaが出した新大規模言語モデル「Llama 2」について解説](https://note.com/generative_ai/n/n4fbf88614b4a)