LoginSignup
1
3

Chainlit の LangChain デフォルト動作をオーバーライドする

Last updated at Posted at 2023-06-10

はじめに

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
1
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3