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
クライアントから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)
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)
正解を導く能力はありますが、指定のフォーマットで出力するのにあと一歩足りないように見えます。
これならばカスタムParserを実装すれば、タスク完了できるかもしれませんね!
この記事が気に入ったらサポートをしてみませんか?