はじめに
LangChain で作ったチェーンやエージェントがあれば, Chainlit で簡単にチャット UI を作れます.
(Chainlit については以下に説明を書きましたので, よければご覧ください.)
チェーンやエージェントさえ作れば, あとはいい感じにやってくれる Chainlit ですが,
いい感じにやってくれるところ (推論実行やメッセージ送信など) をカスタマイズしたい場合があります.
デフォルト動作をオーバーライドする
そこで, langchain_run
デコレータで, デフォルト動作をオーバーライドできます.
例としてチャット履歴をファイルに保存するようにしてみます.
チャット履歴には ChatMessageHistory
クラスを使っています.
なお, Chainlit がいい感じに推論実行やメッセージ送信してた処理をオーバーライドすることになります.
そのため, その処理を変えたくない場合は, 自分で推論実行やメッセージ送信を書いてあげる必要があります.
0.6.0 で langchain_run
デコレータは削除されました.
そのため 0.6 系以降では, 以下のコードは使えません.
my_chat.py
from langchain.memory import ChatMessageHistory
from langchain.schema import messages_to_dict
import chainlit as cl
import json
import my_chain
history = ChatMessageHistory()
@cl.langchain_run
async def run(chain, query: str):
# チェーンを実行
answer = await chain.acall(query, callbacks=[cl.AsyncChainlitCallbackHandler()])
# 実行結果のメッセージを送信
await cl.Message(content=answer["text"]).send()
# チャット履歴に User と Chatbot のメッセージを追加
history.add_user_message(query)
history.add_ai_message(answer["text"])
# JSONファイルとして保存
with open("history.json", "w") as f:
json.dump(messages_to_dict(history.messages), f, indent=2, ensure_ascii=False)
@cl.langchain_factory(use_async=True)
def factory():
return my_chain.create_chain()
チャットしてみると, ファイルに履歴が保存されるようになっています.
チャット履歴ファイル
history.json
[
{
"type": "human",
"data": {
"content": "おはよう",
"additional_kwargs": {},
"example": false
}
},
{
"type": "ai",
"data": {
"content": "おはようございますやんけ!",
"additional_kwargs": {},
"example": false
}
},
{
"type": "human",
"data": {
"content": "おもしろい",
"additional_kwargs": {},
"example": false
}
},
{
"type": "ai",
"data": {
"content": "おもろいやん!",
"additional_kwargs": {},
"example": false
}
},
{
"type": "human",
"data": {
"content": "ありがとう",
"additional_kwargs": {},
"example": false
}
},
{
"type": "ai",
"data": {
"content": "おおきに!",
"additional_kwargs": {},
"example": false
}
}
]
バージョン情報
- Chainlit 0.3.0
- LangChain 0.0.200
- Python 3.9.16