Hugging FaceのモデルをLangChainで使う方法を調べた
今回はLangChainの小ネタの記事でHugging FaceのモデルをLangChainで扱う方法について調べたので、その記事になります。
LangChainについてご存じないという方のために一言で説明するとLangChainはChatGPTの内部で使われているLLMを扱いやすい形でwarpしたライブラリになります。紹介記事を以前書きましたので、詳しく知りたい方はこちらをご覧ください。
LangChainのexampleを見ると多くの場合OpenAIのAPIを使うことが多いように感じます。ただ、OpenAIのモデルは精度が良いのですが、一方で長文の生成をしようとするとかなりの額のお金が必要になります。このため、遊びで使うには勇気がいるケースがあります。
このため、懐に優しい形でLangChainを扱えないか?ということで、有名どころのモデルが大体おいてあるHugging Faceを利用してLangChainで使う方法を調べました。
調べるにあたって作ったコードはここに置いてあります。コード全体が見たいかたはこちらをご覧ください。
https://github.com/shu65/langchain_examples/blob/main/langchain_hugging_face_example.ipynb
目次
Hugging Faceとは?
ここ最近、Hugging Faceは良く目にしますが、念のため説明しておきます。Hugging Faceは様々な機械学習のライブラリを開発している企業で、モデルやデータセットなどを共有するプラットフォームも提供しています。
たとえば、こちらの紹介記事を書いたTransformersはHugging Faceが作っているものになります。
ここ最近の公開されている有名どころのモデルは大体Hugging Faceからダウンロードできるようになっているので、既存のモデルを試したいというときは非常に便利です。
今回はHugging Faceが運営しているプラットフォームにおいてあるモデルをLangChainで使う方法について説明します。
Hugging FaceにおいてあるモデルをLangChainで使う
Hugging FaceのモデルをLangChainで使う方法としていくつか用意されています。今回はこの中の以下の二つについて紹介します。
- Hugging Face APIを利用する方法
- Hugging Faceからモデルをダウンロードしてきて手元の計算機でLLMを動かす方法
それぞれ順番に説明していきます。
Hugging Face APIを利用する方法
Hugging Face上においてあるモデルは制約はありますが、API経由で利用することができます。
APIのトークンの取得に関しては公式のチュートリアルを参考にしてください。
https://huggingface.co/docs/api-inference/quicktour
LangChainで利用する場合はHUGGINGFACEHUB_API_TOKEN
という環境変数に上で取得したトークンを入れておく必要があります。
今回のコードではnotebookを公開する都合上、トークンの中身がコードにでてこないようにdotenv
を利用して環境変数の設定をしています。手元で動かす際は以下のようにすれば十分です
export HUGGINGFACEHUB_API_TOKEN=XXXX
あとは以下のようにHugging Face APIを利用したLLMのインスタンスを用意します。
from langchain import HuggingFaceHub
repo_id = "google/flan-t5-xl"
llm = HuggingFaceHub(repo_id=repo_id, model_kwargs={"temperature":0, "max_length":64})
ここではモデルとしてGoogleのFlan-T5のXLというサイズのモデルを利用しています。model_kwargs
はモデルごとに指定できるものが違うので注意してください。ここではtemperature
と max_length
を指定しています。
LLMが用意できればあとはOpenAIのモデルのときと同じ感覚で利用することができます。ここでは簡単にLangChainを使って以下のように質問して答えてもらいます
Who won the FIFA World Cup in the year 1994?
コードとしては以下の通りです。
template = """Question: {question}
Answer: Let's think step by step."""
prompt = PromptTemplate(template=template, input_variables=["question"])
llm_chain = LLMChain(prompt=prompt, llm=llm)
question = "Who won the FIFA World Cup in the year 1994? "
llm_chain.run(question)
このコードは以下のように出力されました。
The FIFA World Cup is a football tournament that is played every 4 years. The year 1994 was the 44th FIFA World Cup. The final answer: Brazil.
調べてみると1994年は確かにブラジルが優勝しているので正しい回答が得られているようです。
Hugging Faceからモデルをダウンロードしてきて手元の計算機でLLMを動かす方法
次にHugging Faceのモデルを手元にダウンロードしてきてLangChainで利用する方法を説明していきます。
まず、LLMの準備ですが以下のようにします。
from langchain.llms import HuggingFacePipeline
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
model_id = "gpt2"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id)
pipe = pipeline(
"text-generation", model=model, tokenizer=tokenizer, max_new_tokens=64
)
llm = HuggingFacePipeline(pipeline=pipe)
Google Colabで動かす都合上、小さめのモデルということでここではGPT-2を利用しています。
基本的な使い方としては良くあるHugging Faceの使い方である AutoTokenizer
と AutoModelForCausalLM
を利用してtokenizerとmodelを用意します。その後LangChainが用意している HuggingFacePipeline
を使ってLangChainで使えるLLMのインスタンスを作ります。
あとは先ほどと同様にすればLangChainでHugging Faceのモデルを利用することができます。コードはAPIのときと同じため省略します。またGPT-2ということもあり、結果はめちゃくちゃなので、出力結果も省略します。
終わりに
今回はLangChainでHugging Faceのモデルを利用する方法について調べたのでそのまとめを書きました。
LangChainのほうで思った以上に簡単に使えるように整備されている印象で、どの関数を使えばわかっていればすぐに使うことはできました。今回は紹介しませんでしたが他にもHugging Faceのモデルを動かす方法は用意されているようなので興味のある方は調べてみてください。
この記事が他の方の参考になれば幸いです。