ChatGLM3-6B Streamlit界面实战开发添加文件上传PDF解析对话功能1. 项目概述今天我要分享一个特别实用的项目如何在ChatGLM3-6B的Streamlit界面中添加文件上传和PDF解析对话功能。这个功能可以让你的本地AI助手直接读取PDF文档内容并基于文档内容进行智能对话。想象一下这样的场景你有一份技术文档、论文或者报告不想手动复制粘贴内容而是直接让AI读取并帮你分析、总结、回答相关问题。这就是我们要实现的功能。核心价值本地化处理所有文件都在你的机器上处理确保数据安全即开即用上传PDF后立即可以开始对话智能解析AI不仅能读取文字还能理解内容含义多轮对话基于文档内容进行深入讨论2. 环境准备与依赖安装在开始之前确保你已经有了基础的ChatGLM3-6B Streamlit环境。我们需要添加一些新的依赖库来处理PDF文件。# 新增的依赖库 pip install pypdf2 pip install python-docx pip install streamlit-file-browser # 已有的核心依赖 pip install streamlit pip install transformers4.40.2 pip install torch这些库的作用pypdf2用于解析PDF文件内容python-docx虽然本篇聚焦PDF但这个库可以让你未来支持Word文档streamlit-file-browser提供更好的文件上传体验3. 文件上传功能实现让我们从最简单的文件上传功能开始。Streamlit原生就提供了文件上传组件使用起来非常方便。3.1 基础文件上传组件import streamlit as st from PyPDF2 import PdfReader def main(): st.title(ChatGLM3-6B with PDF Support) # 文件上传组件 uploaded_file st.file_uploader( 选择PDF文件, type[pdf], help上传PDF文件后AI可以读取内容并回答相关问题 ) if uploaded_file is not None: # 显示文件信息 st.success(f已上传: {uploaded_file.name}) # 解析PDF内容 try: pdf_reader PdfReader(uploaded_file) text for page in pdf_reader.pages: text page.extract_text() \n # 保存解析的文本到session state st.session_state[pdf_text] text st.session_state[current_file] uploaded_file.name # 显示解析结果预览 with st.expander(查看解析的文本内容): st.text_area(PDF内容, text, height300) except Exception as e: st.error(f解析PDF时出错: {str(e)}) if __name__ __main__: main()这个基础版本已经可以实现PDF上传和解析了。但是我们需要把它集成到完整的ChatGLM对话系统中。4. 集成到ChatGLM对话系统现在我们要把PDF解析功能整合到完整的AI对话系统中。4.1 增强的会话管理import streamlit as st from PyPDF2 import PdfReader import os # 初始化session state if pdf_text not in st.session_state: st.session_state.pdf_text if current_file not in st.session_state: st.session_state.current_file None if messages not in st.session_state: st.session_state.messages [] def extract_text_from_pdf(uploaded_file): 从PDF文件中提取文本 try: pdf_reader PdfReader(uploaded_file) text for page in pdf_reader.pages: page_text page.extract_text() if page_text: text page_text \n return text except Exception as e: st.error(fPDF解析失败: {str(e)}) return None def main(): st.sidebar.title(文档对话设置) # 文件上传区域 uploaded_file st.sidebar.file_uploader( 上传PDF文档, type[pdf], help上传后AI可以基于文档内容回答你的问题 ) if uploaded_file is not None: if st.session_state.current_file ! uploaded_file.name: # 新文件重新解析 with st.spinner(正在解析PDF文档...): pdf_text extract_text_from_pdf(uploaded_file) if pdf_text: st.session_state.pdf_text pdf_text st.session_state.current_file uploaded_file.name st.session_state.messages [] # 清空历史对话 st.sidebar.success(文档解析完成) # 显示当前文档信息 if st.session_state.current_file: st.sidebar.info(f当前文档: {st.session_state.current_file}) if st.sidebar.button(清除当前文档): st.session_state.pdf_text st.session_state.current_file None st.session_state.messages [] st.rerun() # 主聊天界面 st.title( ChatGLM3-6B 文档智能助手) # 显示聊天记录 for message in st.session_state.messages: with st.chat_message(message[role]): st.markdown(message[content]) # 聊天输入 if prompt : st.chat_input(请输入你的问题...): # 添加用户消息 st.session_state.messages.append({role: user, content: prompt}) with st.chat_message(user): st.markdown(prompt) # 准备AI回复 with st.chat_message(assistant): message_placeholder st.empty() full_response # 构建增强的提示词 if st.session_state.pdf_text: enhanced_prompt f 基于以下文档内容回答用户的问题 文档内容 {st.session_state.pdf_text[:3000]} # 限制上下文长度 用户问题{prompt} 请根据文档内容回答问题如果文档中没有相关信息请如实告知。 else: enhanced_prompt prompt # 这里应该是调用ChatGLM模型的代码 # 模拟响应 for chunk in generate_response(enhanced_prompt): full_response chunk message_placeholder.markdown(full_response ▌) message_placeholder.markdown(full_response) st.session_state.messages.append({role: assistant, content: full_response}) def generate_response(prompt): 模拟模型响应生成 # 实际项目中这里应该调用ChatGLM模型 # 返回一个生成器实现流式输出 responses [ 让我根据文档内容来回答你的问题。, 从文档中我看到相关信息, 文档提到这个技术的主要特点包括..., 总结来说文档建议的做法是... ] for response in responses: yield response import time time.sleep(0.5) if __name__ __main__: main()5. 高级功能增强让我们添加一些更实用的功能来提升用户体验。5.1 多文档管理和切换# 在main函数中添加多文档管理 if uploaded_files not in st.session_state: st.session_state.uploaded_files {} # 多文件上传和管理 uploaded_files st.sidebar.file_uploader( 上传PDF文档可多选, type[pdf], accept_multiple_filesTrue, help可以上传多个文档然后选择要对话的文档 ) for file in uploaded_files: if file.name not in st.session_state.uploaded_files: with st.spinner(f正在解析 {file.name}...): text extract_text_from_pdf(file) if text: st.session_state.uploaded_files[file.name] text # 文档选择器 if st.session_state.uploaded_files: selected_file st.sidebar.selectbox( 选择要对话的文档, optionslist(st.session_state.uploaded_files.keys()), index0 ) if selected_file ! st.session_state.get(current_file): st.session_state.current_file selected_file st.session_state.pdf_text st.session_state.uploaded_files[selected_file] st.session_state.messages [] st.rerun()5.2 文档内容摘要和关键信息提取def generate_document_summary(text): 生成文档摘要 # 在实际项目中使用AI模型生成摘要 summary_prompt f 请为以下文档生成一个简洁的摘要 {text[:2000]} 摘要应该包括 1. 文档的主要主题 2. 关键要点 3. 文档类型技术文档、论文、报告等 # 这里调用AI模型生成摘要 return 这是一个技术文档主要介绍了人工智能和机器学习的基本概念和应用场景。 # 在文档解析后生成摘要 if st.session_state.pdf_text and document_summary not in st.session_state: with st.spinner(正在生成文档摘要...): summary generate_document_summary(st.session_state.pdf_text) st.session_state.document_summary summary if st.session_state.get(document_summary): with st.sidebar.expander(文档摘要): st.write(st.session_state.document_summary)6. 完整集成示例下面是完整的代码示例集成了所有功能import streamlit as st from PyPDF2 import PdfReader import os # 初始化所有session state变量 def init_session_state(): if pdf_text not in st.session_state: st.session_state.pdf_text if current_file not in st.session_state: st.session_state.current_file None if messages not in st.session_state: st.session_state.messages [] if uploaded_files not in st.session_state: st.session_state.uploaded_files {} if document_summary not in st.session_state: st.session_state.document_summary def extract_text_from_pdf(uploaded_file): 从PDF文件中提取文本 try: pdf_reader PdfReader(uploaded_file) text for page in pdf_reader.pages: page_text page.extract_text() if page_text: text page_text \n return text except Exception as e: st.error(fPDF解析失败: {str(e)}) return None def main(): init_session_state() st.sidebar.title( 文档管理) # 文件上传 uploaded_files st.sidebar.file_uploader( 上传PDF文档, type[pdf], accept_multiple_filesTrue, help上传PDF文件后AI可以基于文档内容进行对话 ) # 处理新上传的文件 if uploaded_files: for file in uploaded_files: if file.name not in st.session_state.uploaded_files: with st.spinner(f正在解析 {file.name}...): text extract_text_from_pdf(file) if text: st.session_state.uploaded_files[file.name] text st.sidebar.success(f{file.name} 解析完成) # 文档选择 if st.session_state.uploaded_files: selected_file st.sidebar.selectbox( 选择对话文档, optionslist(st.session_state.uploaded_files.keys()), index0 ) if selected_file ! st.session_state.current_file: st.session_state.current_file selected_file st.session_state.pdf_text st.session_state.uploaded_files[selected_file] st.session_state.messages [] st.session_state.document_summary st.rerun() # 显示文档操作 col1, col2 st.sidebar.columns(2) with col1: if st.button( 查看内容): with st.expander(文档内容预览): st.text_area(内容, st.session_state.pdf_text, height300) with col2: if st.button( 移除文档): del st.session_state.uploaded_files[selected_file] if st.session_state.current_file selected_file: st.session_state.current_file None st.session_state.pdf_text st.rerun() # 主聊天界面 st.title( ChatGLM3-6B 文档智能助手) if st.session_state.current_file: st.info(f当前文档: **{st.session_state.current_file}**) # 显示聊天记录 for message in st.session_state.messages: with st.chat_message(message[role]): st.markdown(message[content]) # 聊天输入 if prompt : st.chat_input(请输入关于文档的问题...): # 添加用户消息 st.session_state.messages.append({role: user, content: prompt}) with st.chat_message(user): st.markdown(prompt) # 生成AI回复 with st.chat_message(assistant): message_placeholder st.empty() full_response # 构建上下文 context st.session_state.pdf_text[:3000] if st.session_state.pdf_text else # 模拟流式输出 responses generate_ai_response(prompt, context) for chunk in responses: full_response chunk message_placeholder.markdown(full_response ▌) message_placeholder.markdown(full_response) st.session_state.messages.append({role: assistant, content: full_response}) def generate_ai_response(prompt, context): 生成AI响应 if context: # 基于文档上下文的响应 responses [ 我正在分析文档内容..., f根据文档中的信息, 文档提到相关内容, 我找到了一些重要信息, 总结来说文档的建议是... ] else: # 通用响应 responses [ 我来回答你的问题, 这是一个很好的问题, 根据我的理解, 我认为... ] for response in responses: yield response import time time.sleep(0.3) if __name__ __main__: main()7. 实际应用建议在实际部署这个系统时这里有一些实用建议7.1 性能优化技巧# 使用缓存提高性能 st.cache_resource def load_model(): # 加载ChatGLM模型 # 返回模型实例 pass # 限制文档大小 MAX_FILE_SIZE 10 * 1024 * 1024 # 10MB if uploaded_file.size MAX_FILE_SIZE: st.error(文件太大请上传小于10MB的PDF文件) return7.2 错误处理和用户体验# 添加详细的错误处理 try: pdf_text extract_text_from_pdf(uploaded_file) except Exception as e: st.error(f解析失败: {str(e)}) st.info(请确保上传的是有效的PDF文件且不包含加密保护)7.3 扩展功能思路你可以进一步扩展这个系统支持Word、TXT等更多文档格式添加文档批量处理功能实现文档内容搜索和检索添加对话历史保存和导出集成更多AI能力如文档翻译、内容改写等8. 总结通过这个教程我们成功为ChatGLM3-6B Streamlit界面添加了文件上传和PDF解析对话功能。这个功能让本地AI助手变得更加实用可以直接处理和分析文档内容。关键收获简单集成使用PyPDF2可以轻松解析PDF内容智能对话通过增强提示词让AI基于文档内容回答良好体验流式输出和多文档管理提升用户体验本地安全所有处理都在本地完成确保数据隐私这个项目展示了如何将先进的AI模型与实用的文档处理功能相结合创造出真正有价值的工具。无论是技术文档分析、论文阅读辅助还是报告内容提取这个系统都能提供很大帮助。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。
如何使用pyporter自动生成Python模块的RPM Spec文件?完整教程来了 【免费下载链接】pyporter A rpm packager bot for python modules from pypi.org 项目地址: https://gitcode.com/openeuler/pyporter
前往项目官网免费下载:https://ar.openeul…
openEuler Jenkins构建与安装检查终极指南:确保RPM包可正常构建和安装 【免费下载链接】openeuler-jenkins This repository is used to store the jenkins scripts in openEuler community. 项目地址: https://gitcode.com/openeuler/openeuler-jenkins
前往…
AI SaaS产品的用户激活漏斗设计:从注册到Aha Moment的工程实践
一、激活率低迷:当注册用户迟迟找不到价值
AI SaaS产品普遍面临一个悖论:获客成本持续攀升,但次日留存率却停留在15%至25%之间。用户在注册后的72小时内,…