OpenChat3.5でLangChain


ChatGPT3.5(March)に匹敵するかもしれないOpenChat3.5でLangChainのAgentが動くか知りたかったので、動かしてみました。

OpenChat3.5サーバーを動かす

OpenChat3.5はChatGPT互換APIのサーバーとして動作させることを推奨されています。

まずは、動作環境を作成しましょう。
WSL + Python3.11で動作を確認しています。

mkdir ocht
cd ochat

python -m venv .venv && 
source .venv/bin/activate && 
pip install -U pip && 
pip install flash-attn --no-build-isolation && 
pip install ochat

起動します。

python -m ochat.serving.openai_api_server --model openchat/openchat_3.5


GPU RAM24Gあれば動きます・・・

クライアントからChatGPT互換APIを呼び出す


新しいターミナルを開いて、APIを呼び出してみましょう。

import requests
import json

# セッションを維持するためのメッセージ履歴
message_history = []

while True:
    # ユーザーの入力を受け取る
    user_input = input("You: ")
    if user_input.lower() == "exit":
        break

    # メッセージ履歴にユーザーの入力を追加
    message_history.append({"role": "user", "content": user_input})

    # 送信データの作成
    data = {
        "model": "openchat_3.5",
        "messages": message_history
    }

    # APIリクエストの実行
    response = requests.post("http://localhost:18888/v1/chat/completions",
                             headers={"Content-Type": "application/json"},
                             data=json.dumps(data))

    # 応答の確認と表示
    if response.status_code == 200:
        response_data = response.json()
        assistant_message = response_data['choices'][0]['message']['content']
        print("OpenChat:", assistant_message)

        # メッセージ履歴にアシスタントの応答を追加
        message_history.append({"role": "assistant",
                                "content": assistant_message})
    else:
        print("Error:", response.text)


通信できました!

LangChainで呼び出す

APIをLangChainで直接扱うために、OpenChatクラスにします。

from langchain.chat_models import ChatOpenAI

local_inference_server_url = "http://localhost:18888/v1/"
chat = ChatOpenAI(
    model="openchat_3.5",
    openai_api_key="EMPTY",
    openai_api_base=local_inference_server_url,
    max_tokens=512,
    temperature=1.0,
)

message = "You are a large language model named OpenChat. Describe yourself."

response = chat.invoke(message)
print(response.content)


英語のほうが良い回答をします。

Agentとして動かす

本当にChatGPT3.5相当ならばAgentも動くはず!

from langchain.chat_models import ChatOpenAI
from langchain.tools import DuckDuckGoSearchRun
from langchain.agents import Tool, initialize_agent
from langchain.chains import LLMMathChain
from pydantic import BaseModel, Field

local_inference_server_url = "http://localhost:18888/v1/"
llm = ChatOpenAI(
    model="openchat_3.5",
    openai_api_key="EMPTY",
    openai_api_base=local_inference_server_url,
    max_tokens=512,
    temperature=0.5,
)

# pip install duckduckgo-search
search = DuckDuckGoSearchRun()
tools = [
    Tool(
        name="duckduckgo-search",
        func=search.run,
        description="useful for when you need to answer questions. You should ask targeted questions",
    )
]


class CalculatorInput(BaseModel):
    question: str = Field()


# pip install numexpr
llm_math_chain = LLMMathChain.from_llm(llm=llm, verbose=True)
tools.append(
    Tool.from_function(
        func=llm_math_chain.run,
        name="Calculator",
        description="useful for when you need to answer questions about math",
        args_schema=CalculatorInput,
        # coroutine= ... <- you can specify an async method if desired as well
    )
)

agent = initialize_agent(
    tools,
    llm,
    agent="zero-shot-react-description",
    verbose=True,
    handle_parsing_errors=True,
)

text = "What is the second highest mountain in Japan?"
output = agent.run(text)
output = output.split("\n")[0]
print(output)
失敗・・・? でもFinal Answerは正解!


temperature=1.0で成功!
text = "Who is Leo DiCaprio's girlfriend? What is her current age raised to the 0.43 power?"
output = agent.run(text)
output = output.split("\n")[0]
print(output)


Taskは失敗扱いで、Final Answerは正解!

正解を導く能力はありますが、指定のフォーマットで出力するのにあと一歩足りないように見えます。
これならばカスタムParserを実装すれば、タスク完了できるかもしれませんね!

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