Langchain + Streamlit 乱七八糟踩的坑太多了,简单记录一些。。
1. Langchain 版本问题导致导包失败
ImportError: cannot import name 'create_history_aware_retriever' from 'langchain.chains'
langchain 版本:
langchain 0.0.188
langchain-community 0.2.7
langchain-core 0.2.18
langchain-experimental 0.0.62
python版本:3.11.9
昨天跑的通的代码今天出bug真的会疯,这次怪自己,conda里两个py311和py39都会用来跑llm写的程序。昨天用了py39。好好好。
langchain/python/langchain-experiment等等这些直接的依赖还蛮复杂的。。升级一个容易导致其他都不匹配了,所以:还是直接切环境。
github上的解决方法是安装0.1.7
的langchain,
2. Streamlit 选择文件夹
自带的只有选择单个文件上传的功能,实际需要选择一个文件夹,上传所有文件。用到了tkinter
。
with st.sidebar:
root = tk.Tk()
root.withdraw()
root.wm_attributes('-topmost', 1)
st.write('Please select a folder:')
browse_clicked = st.button('Browse Folder')
# 获取文件夹路径
if browse_clicked:
dirname = str(filedialog.askdirectory(master=root))
3. Streamlit 刷新之后组件消失问题
简单来说就是st点击按钮之后,会重新更新页面,之前的值可能会被flush掉(我是在自定义了打开文件夹之后出现了这个问题)。所以一些state需要存在st.session_state
里。
#先初始化
if 'clicked' not in st.session_state:
st.session_state.clicked = False
if browse_clicked:
# 点击按钮之后修改clicked的值
st.session_state.clicked = True
同理,如果要保存什么数据,为了防止刷新之后丢失,也最好保存在st.session_state
里。