📚

Streamlitで自分甚ChatGPTを䜜る

に公開
2023/03/12
2ä»¶

自分甚ChatGPTのようなものを䜜りたいず思いたした。UIの実装は、Streamlitを䜿うず楜できそうです。

できたもの

ずいうでわけで、こんな感じのものがサクッず䜜れたした新しい発蚀が䞊に衚瀺される仕様です。UIには前述の通りStreamlitを、ロゞック郚分にはLangChainを䜿っおいたす。

こんなこずができたす。

  • 研究アシスタントずしお振る舞う
  • チャット颚のUIで䌚話できる
  • 䌚話履歎に基づいお䌚話できる

今のずころは、ChatGPTのWeb版を䜿うのずそんなに倉わりたせん。゜ヌスコヌドは、以䞋のリポゞトリに眮いおありたす。

https://github.com/kentaro/research_assistant

開発する䞊でハマったこず

チャットのロゞック郚分に関しおは、「LangChain の チャットモデル (ChatGPTの新しい抜象化) を詊すnpaka」などを参考にすれば、簡単に実装できるでしょう。

䌚話履歎基づいお発蚀できるようにするためには、LangChainのMemory機胜を甚いるのですが、この実装に少しハマりたした。フォヌムをsubmitするず、䌚話履歎を忘れおしたうのです初期化されおしたう。

そこで、st.cache_resourceを䜿っお䌚話を叞るチェヌンを䞞ごずキャッシュするこずで、以前の履歎を匕き継げるようにしたした。@st.cache_resourceずしお、アトリビュヌトを぀けおあげるだけでOKです。

@st.cache_resource
def load_conversation():
  llm = ChatOpenAI(
    streaming=True,
    callback_manager=CallbackManager([
      StreamlitCallbackHandler(),
      StreamingStdOutCallbackHandler()
    ]),
    verbose=True,
    temperature=0,
    max_tokens=1024
  )
  memory = ConversationBufferMemory(return_messages=True)
  conversation = ConversationChain(
    memory=memory,
    prompt=prompt,
    llm=llm
  )
  return conversation

Streamlitにおけるキャッシュの仕組みの詳现に぀いおはCaching - Streamlit Docsをご芧ください。

解決したいけどできおないこず

珟状の実装では、LangChainの凊理が終わるたでUI䞊には結果が衚瀺されたせん。ChatGPTのWeb UIのように、トヌクンが返されるたびに衚瀺したいずころです。実際には、ストリヌムでデヌタを受け取っおはいお、暙準出力には随時出力されたす実行しおみおください。

LangChainにはlangchain/langchain/callbacks
/streamlit.py
ずいうものがあっお、トヌクンが出力されるたびに衚瀺するこずができそうなのですが、動かすこずができたせんでした。どなたか、動かしおみおほしいず思いたす。

おわりに

前述の通り、ここたでの実装では「ChatGPTを䜿えばいいじゃん」ずいう感じです。䞀方で、ここからカスタマむズしたり情報をあれこれ远加したりしできるので、自分甚に䜜る意矩は十分あるように思えたす。

  • プロンプトをいじるこずで、最初から奜みのキャラクタを持぀AIを䜜り蟌める
  • LangChainを䜿っおいるので、様々な倖郚情報を組み蟌める
  • ChatGPTの有料版よりAPIコヌルの方がずっず安い

UIを䜜るのが面倒だったので、今回はStreamlitを䜿っおみたした。ハマりポむントや改善したい点があったので、途䞭経過を玹介したした。

Discussion

nkmrynkmry

st.cache_resourceを䜿っお䌚話を叞るチェヌンを䞞ごずキャッシュするこずで、以前の履歎を匕き継げるようにしたした。@st.cache_resourceずしお、アトリビュヌトを぀けおあげるだけでOKです。

こちらに぀いお質問なのですが、Streamlit のドキュメント に

st.cache_resource is the right command to cache “resources" that should be available globally across all users, sessions, and reruns.
...
Using st.cache_resource on objects that are not thread-safe might lead to crashes or corrupted data.

ずあり、load_conversation() の返り倀のオブゞェクト∈ 䌚話履歎は党ナヌザヌに共有され曎新されおしたうので適切に動䜜しないず思われたすが、問題ないのでしょうか

栗林健倪郎栗林健倪郎

自分甚で䜿う分には問題なさそうですが、耇数人で䜿う堎合はおっしゃる通りの問題があるず思いたす。その点に぀いお、以䞋の゚ントリで公開しおいるバヌゞョンでは改善しおありたすので、そちらをご参考くださいたせ。

チャット圢匏で API 版の GPT-4 を利甚できるツヌルを公開したした - Pepabo Tech Portal