見出し画像

rinna社からLangChainのAgent動作に特化したvicuna-13bモデル

rinna社から、先日の日本語特化のGPT言語モデルの公開に引き続き、今度はLangChainをサポートするvicuna-13bモデルが公開されました。

日本語がとても流暢な、rinna/japanese-gpt-neox-3.6b-instruction-ppo と、論理的な推論に強いモデルを組み合わせることを提案してくれているのだと思います。痒い所に手が届くというか…。流石です。

というわけで、早速ためしてみます!😊

1.モデルの概要

  • vicuna-13b-delta-finetuned-langchain-MRKLは、langchain-MRKL 形式の 少量の学習データで vicuna-13b を微調整することによってトレーニングされたオープンソースのチャットモデルです。

  • vicuna-13b の高い推論性能を活用して、ファインチューニングで出力を langchain-MRKL に厳密に適合させることで、冗長なトークンを発生させないことから推論が大幅に改善されています。

  • ファインチューニングに実際に使用したサンプル数は 15 個。混合データを使用して1エポックだけトレーニングを実施。

2.モデル準備・RESTful APIサーバーの起動

  1. LLaMA-13Bからの差分ウェイトをダウンロードして適用。(通常のVicuna-13Bの手順と同じ)

  2. 差分を適用したモデルを FastChat のRESTful APIサーバーから起動。詳細はドキュメントdocs/openai_api.mdを参照してください。わたしの環境(RTX3090)ではGPUメモリが不足するため--load-8bitオプションを付けました。

$ python3 -m fastchat.serve.controller
$ python3 -m fastchat.serve.openai_api_server --host localhost --port 8000
 $ python3 -m fastchat.serve.model_worker --model-name 'rinna-13b-langchain'\
           --model-path /home/xxx/models/rinna-vicuna-13b-finetuned-langchain-MRKL \
           --load-8bit 

今回は試していませんが、llama.cppから利用する方法も可能だと思います。

3.動作確認

  • 公式サンプルではrequestsで直接APIを叩く方法が示されていて、OpenAI 互換APIの動作が学べますが、私はシンプルにLangChainのLLMラッパーから操作する方法で動作確認してみます。

3.1 ライブラリのインポートなど

# サンプルで使うSERPAPIのAPI KEYの設定

import os
os.environ["SERPAPI_API_KEY"] = "YOUR API KEY"
# openaiのapi_baseの設定ほか

import openai
openai.api_key = "EMPTY" # Not support yet
openai.api_base = "http://localhost:8000/v1"

model = "rinna-13b-langchain" 
# LangChain関係もろもろ

from langchain.chat_models import ChatOpenAI
from langchain.agents import initialize_agent, Tool
from langchain import LLMMathChain, SerpAPIWrapper
from langchain.chains.conversation.memory import ConversationBufferMemory

3.2 LLMラッパー設定、Chainの作成ほか

llm = ChatOpenAI(model_name=model, temperature=0)

search = SerpAPIWrapper()
llm_math_chain = LLMMathChain(llm=llm, verbose=True)
tools = [
    Tool(
        name = "Search",
        func=search.run,
        description="useful for when you need to answer questions about current events"
    ),
    Tool(
        name="Calculator",
        func=llm_math_chain.run,
        description="useful for when you need to answer questions about math"
    )
]

memory = ConversationBufferMemory(memory_key="chat_history")
agent = initialize_agent(tools, llm, agent= "zero-shot-react-description", verbose=True, memory=memory,max_iterations=4,early_stopping_method="generate")

3.3 それでは実行!

agent.run("The current age of the prime minister of Japan multiplied by 0.5.")

> Entering new AgentExecutor chain...
I need to find the current age of the prime minister of Japan and then calculate their age multiplied by 0.5.
Action: Search
Action Input: current age of prime minister of Japan

Observation: 65 years
Thought:I need to calculate the prime minister's age multiplied by 0.5 Action: Calculator
Action Input: 65 \* 0.5


> Entering new LLMMathChain chain...
65 \* 0.5```
text 65 * 0.5
```
...numexpr.evaluate("65 * 0.5")...

Answer: 32.5
> Finished chain.

Observation: Answer: 32.5
Thought:I now know the final answer
Final Answer: 32.5


> Finished chain.

'32.5'

安定した動作で正解を導びきました。すごい。😄

まとめ

  • ローカル環境で効率的にLangChainを運用できる、とても高品質なLLMが公開されたことは、とても有意義だと思います。

  • また、特定のタスクにより適合するよう、人力で作成可能な、少量の学習データでファインチューニングができることが示されたことは、興味深い結果だと思います。

お読みいただき、ありがとうございました。

現場からは以上です。

この記事が気に入ったらサポートをしてみませんか?