Streamlit
Streamlit 是一个开源的 Python 库,可轻松创建和共享美观、自定义的机器学习和数据科学网页应用。
该笔记本介绍了如何在 Streamlit 应用中存储和使用聊天消息历史。StreamlitChatMessageHistory 将在指定的 key= 处,把消息存储在 Streamlit 会话状态 中。默认键为 "langchain_messages"。
- 注意,
StreamlitChatMessageHistory仅在 Streamlit 应用中运行时才有效。 - 您可能也会对用于 LangChain 的 StreamlitCallbackHandler 感兴趣。
- 有关 Streamlit 的更多信息,请查看其 入门文档。
该集成位于 langchain-community 包中,因此我们需要安装它。我们还需要安装 streamlit。
pip install -U langchain-community streamlit
您可以看到 在此处运行的完整应用示例,以及更多示例在 github.com/langchain-ai/streamlit-agent。
from langchain_community.chat_message_histories import (
StreamlitChatMessageHistory,
)
history = StreamlitChatMessageHistory(key="chat_messages")
history.add_user_message("hi!")
history.add_ai_message("whats up?")
API 参考:Streamlit聊天消息历史
history.messages
我们可以轻松地将此消息历史类与LCEL 可运行组件结合使用。
历史记录将在给定用户会话内的 Streamlit 应用多次运行之间被持久保存。特定的 StreamlitChatMessageHistory 不会在不同用户会话之间被持久保存或共享。
# Optionally, specify your own session_state key for storing messages
msgs = StreamlitChatMessageHistory(key="special_app_key")
if len(msgs.messages) == 0:
msgs.add_ai_message("How can I help you?")
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_openai import ChatOpenAI
prompt = ChatPromptTemplate.from_messages(
[
("system", "You are an AI chatbot having a conversation with a human."),
MessagesPlaceholder(variable_name="history"),
("human", "{question}"),
]
)
chain = prompt | ChatOpenAI()
chain_with_history = RunnableWithMessageHistory(
chain,
lambda session_id: msgs, # Always return the instance created earlier
input_messages_key="question",
history_messages_key="history",
)
对话式 Streamlit 应用通常会在每次重新运行时重绘每个先前的聊天消息。通过迭代 StreamlitChatMessageHistory.messages 可轻松实现这一点:
import streamlit as st
for msg in msgs.messages:
st.chat_message(msg.type).write(msg.content)
if prompt := st.chat_input():
st.chat_message("human").write(prompt)
# As usual, new messages are added to StreamlitChatMessageHistory when the Chain is called.
config = {"configurable": {"session_id": "any"}}
response = chain_with_history.invoke({"question": prompt}, config)
st.chat_message("ai").write(response.content)