Dolly2.0 + DeepL APIで即席の日本語対応させてみる


# はじめに

オープンソースで商用利用可能なLLMとして注目を浴びている [Dolly2.0](https://www.databricks.com/jp/blog/2023/04/12/dolly-first-open-commercially-viable-instruction-tuned-llm)ですが、元々のモデルのトークナイザーやファインチューニングしたデータセットなどが多言語対応していないため、日本語などでのやりとりがイマイチな状況です。

頑張って精度の高い日本語対応のモデルを作るという手もありますが、楽をしたい私としては今のモデルでなんとかならないか？と言う事で DeepL APIを使って、即席の日本語対応Dollyを作ってみました。

# DeepL API　
https://www.deepl.com/ja/docs-api

**「DeepL API Freeのプランでは、1か月に50万文字までの翻訳が無料です」** とあります。
個人的にはこちらで十分なので、早速登録してTokenを取得します。

Databricks上で利用出来るように、[Secretsを作成](https://qiita.com/taka_yayoi/items/7e4eae0786b94cb7a5de#%E3%82%B7%E3%83%BC%E3%82%AF%E3%83%AC%E3%83%83%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90)しておけば、以下のようにノートブック上でTokenを呼び出せます。例えば、 `my_scope`というスコープ名で、`deepl_key` というKeyでTokenを追加した場合は以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/6ffa3dba-4b47-392f-e2c9-482bd080d49c.png)

# まずはDollyをそのまま使ってみる

比較するためlangchainとDollyを組み合わせたチャットボットの作成をして、そのままだとどうなのか確認してみます。今回は[dolly-v2-7b](https://huggingface.co/databricks/dolly-v2-7b) を利用しました。他にも3b,12bのモデルも利用出来ます。

```python:dolly-v2-7bを利用
import torch
from transformers import pipeline

generate_text = pipeline(model="databricks/dolly-v2-7b", 
                          torch_dtype=torch.bfloat16,
                          trust_remote_code=True, 
                          device_map="auto", 
                          return_full_text=True)
```

今回は、ITに関するQAに回答出来るようプロンプトを作成します。

```python
from langchain import PromptTemplate, LLMChain
from langchain.llms import HuggingFacePipeline

# template for an instrution
template = """You are an IT Specialist. Please answer thier question simply. If you don't know, say that you do not know. 
  Question: {instruction}
"""

prompt = PromptTemplate(input_variables=["instruction"], 
                        template=template)

hf_pipeline = HuggingFacePipeline(pipeline=generate_text)

llm_chain = LLMChain(llm=hf_pipeline, prompt=prompt)
```


### 早速質問してみます。(Dollyに直接、日本語の質問の場合）

```python:質問
qa = "DWHとレイクハウスの違いについて説明してください。"
print(llm_chain.predict(instruction=f"{qa}"))
```
>回答：
>Data Warehouse and R analytica are two different tools that can help a business make >better decisions. In this case, R analyica can help your business find correlations >between data and answer useful queries. DWH is a storage place where your business can >store the data that R analyica creates for you.

日本語で質問しても、英語で返ってきました。また回答内容もめちゃくちゃですね。

# DeepL APIをDollyに付け加えてみる

それではDollyへの入力部分と出力部分にDeepLによる翻訳を付け加える関数を作っておきます。

```python
import deepl
translator = deepl.Translator(API_KEY)

# 日本語 -> 英語
def input_trans(text):
    source_lang = 'JA'
    target_lang = 'EN-GB'
    results = translator.translate_text(text, source_lang=source_lang, target_lang=target_lang)
    return results.text

# 英語 -> 日本語
def output_trans(text):
    source_lang = 'EN'
    target_lang = 'JA'
    outputs = translator.translate_text(text, source_lang=source_lang, target_lang=target_lang)
    return outputs.text
```

先ほどのDollyへ上記関数を追加し、新しい関数`dolly_ja`を作ります。

```python
def dolly_ja(text):
  # 日本語質問を英語に変換
  en_input = input_trans(text)

  # Dollyへ問い合わせ
  result = llm_chain.predict(instruction=f"{en_input}".lstrip())

  #　問い合わせ結果を日本語に変換.　表示を統一するため改行毎に翻訳
  sentences = result.split("\n\n")
  for word in sentences:
    print(output_trans(word) + "\n")
```

### 早速質問してみます。(Dolly+DeepL）

```python:質問
dolly_ja("DWHとレイクハウスの違いについて説明してください。")
```

>回答：
>DWHとはデータウェアハウスのことで、データを保存し、分析を行うコンピューティングシステムです。  データウェアハウスは、ハードディスク、光学ドライブ、テープ、クラウドなど、さまざまなタイプのストレージを使用することができます。  レイクハウスは、ソースから直接データを保存するデータレイクであり、レイクから直接データに対して分析クエリーを実行する能力を提供します。  レイクハウスは、データが保存されているコンピューティングシステムにアクセスする必要がないという利点があります。

ちゃんと日本語で回答が返ってきました。（当然ですがw)
回答内容はちょっと間違っている感じですが、文章としてはまともな感じになってます。

他の質問も投げてみました。

```python:質問
dolly_ja("データ分析者を増やすにはどうすればいいですか。")
```

>回答:
これには多くの方法があります。まず、アナリストを追加する必要があるかどうかは、ビジネスによって異なります。ビジネス上のニーズがある場合は、ビジネスが必要とするスキルを持つスタッフを適切に配置する必要があります。多くの組織では、数学を得意とする高度な技術を持つデータアナリストが必要とされています。このような場合、その役割を適格な候補者で満たしていることを確認する必要があります。データアナリストを採用する際のアプローチとして、履歴書にアナリティクスの経験があるかどうかを確認することがあります。
もし、あなたのビジネスがデータアナリストを増やす必要がないのであれば、現在のスタッフが適切なトレーニングを受け、業務に必要な資格を有しているかどうかを考える必要があります。この場合、アナリストのトレーニングを新たに検討し、アナリストに求められるより専門的なデータ業務ができるように訓練するのもよいでしょう。

かなりまともな回答が返ってきました。このような正解が複数あるようなQAの方が得意なのかもしれないですね。回答も質問に沿ったものになっており、コミュニケーションもとれそうです。

# パフォーマンスの違い

今回、AWSのg5.4xlarge (1GPU,64GB Memory)x1台の環境でしたが、同じ質問に対するレスポンスタイムは以下の通りでした。
- 直接Dollyに投げた場合：3.1秒
- DeepLを追加した場合：6.2秒

やはり３秒程度の遅延が発生してました。

# 最後に

遅延やコストの事を考えると日本語対応したモデルを将来的には作った方がいいと思いますが、簡易版として対応させるには意外と優秀かも（？）と思いました。