見出し画像

OpenAI互換APIサーバーたてて、LangChainで遊ぶ

FastChatがバージョンアップして、LangChainとOpenAI互換のローカルAPIサーバーとの統合方法が詳しめで紹介されていました。


モデルのダウンロード

  • FastChat 初回起動時に自動でモデルがダウンロードされるので、特に何もしなくても大丈夫です。

  • 以前のVicuna-13b-v1.1では、LLaMAから手動でデルタを適用する必要がありましたが、現行のFastChat のバージョンでは、モデル起動時に自動でデルタ適用済みのモデルがダウンロードしてくれるようになりました。

RESTful APIサーバーの起動

 各サーバーを起動します。

  • まずは controllerを起動します。

$ python3 -m fastchat.serve.controller
  • LangChainから呼び出すOpenAI APIのモデル名に見せかけるために、worker 起動時に、OpenAI公式のchat completionモデル、completionモデル、および embeddingモデルの名前を拝借します。

  • 私の環境では13bモデルだとGPUのメモリ不足になるので、8bit量子化オプションを指定します。

$ python3 -m fastchat.serve.model_worker --model-names "gpt-3.5-turbo,text-davinci-003,text-embedding-ada-002" \
  --model-path lmsys/vicuna-13b-v1.3 --load-8bit
  • 最後はopenai_api_serverを起動。

$ python3 -m fastchat.serve.openai_api_server --host localhost --port 8000

動作確認

EmbeddingとChat completionモデルの動作確認をしてみます。
ネタは例によって、青空文庫の走れメロスです。

from langchain.chat_models import ChatOpenAI
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA

# 環境変数の準備
import os
os.environ["OPENAI_API_KEY"] = "EMPTY"
os.environ["OPENAI_API_BASE"] = "http://localhost:8000/v1"
 
embeddings = OpenAIEmbeddings()
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0, max_tokens=400)

# テキストの読み込みと、dbの準備
loader = TextLoader('hashire_merosu.txt')
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=400, chunk_overlap=0)
texts = text_splitter.split_documents(documents)
db = Chroma.from_documents(texts, embeddings)

retriever = db.as_retriever()
qa = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=retriever)

# 質問タイム
questions = [
    "メロスの職業は?",
    "メロスの友人の名前は?",
    "王が人を殺す理由"
]

for query in questions:
    print("Query:", query)
    print("Answer:", qa.run(query))

Query: メロスの職業は?
Answer: メロスは村の牧人であるとされています。
Query: メロスの友人の名前は?
Answer: メロスの友人の名前は「セリヌンティウス」です。
Query: 王が人を殺す理由
Answer: 王が人を殺す理由は、彼が信じる正義のためだということです。彼は、彼が信頼されている者を守るために、彼の国を支配するために必要な殺害を行っています。彼は、彼が信じる正義のために、彼の国を守るために、必要な行動をとることを説明しています。

最後の答えは若干微妙な気もしますが、Vicuna-13b にしては上出来だと思います👍。ローカル環境だけでも、けっこう遊べる感じになりましたね。

ただ、もはや純正OpenAI APIのFunction callingが手放せない体になってしまっているので😅、オープンソース系LLMでも、Function calling対応が待ち遠しいです。

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

この記事が参加している募集

AIとやってみた

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