1、立项背景和目标:
在工作和学习中,我们经常需要处理大量的PDF、Word、TXT等格式的文档(如行业报告、产品手册、研究论文)。传统方式下,在这些文档中查找特定信息效率低下,且难以进行深度的知识整合。本项目旨在开发一个智能个人知识库系统,允许用户上传自己的文档库,并能够通过自然语言进行提问,系统能快速、准确地从文档中定位并生成答案,从而极大提升信息检索和知识消化的效率。
2、软件功能、核心功能模块的介绍:
文档管理模块:支持多格式文档(PDF, DOCX, TXT)的上传、列表展示与删除。
向量化存储模块:自动将上传的文档进行文本分割,并调用嵌入模型将其转换为向量,存储至Chroma向量数据库中。
智能问答模块:提供对话界面,用户输入问题后,系统首先从向量库中检索最相关的文档片段,然后将这些片段与用户问题一同提交给大型语言模型(如GPT-3.5-turbo),生成一个精准、有上下文依据的答案。
3、业务流程、功能路径描述:
用户首先进入Web应用主界面 -> 在“文档上传”区上传一个或多个文档 -> 系统后台处理文档,并在界面上显示“处理成功” -> 用户切换到“知识问答”标签页 -> 在输入框中用自然语言提出问题,例如“总结一下文档中关于市场趋势的要点” -> 系统在1-3秒内返回一个结构清晰、引用了源文档内容的答案。
1、整体架构和设计思路,不同模块使用的技术栈。
项目采用前后端一体的轻量级架构,使用Streamlit快速构建Web界面。后端逻辑完全由Python驱动。
前端/交互层:Streamlit。负责渲染文件上传组件、聊天界面和结果显示。
业务逻辑层:LangChain框架。它像“胶水”一样串联了整个流程,包括文档加载器、文本分割器、向量检索链和与大模型的对话链。
数据层:Chroma(向量数据库)。用于存储和高效检索文档的向量化表示。嵌入模型使用了OpenAI的text-embedding-3-small,大模型使用了OpenAI的gpt-3.5-turbo。
2、“我”的负责模块和结果(尽可能量化)。
我是该项目的全栈开发者,负责从零到一的所有工作。
结果量化:
实现了对3种常见文档格式的解析支持。
在包含50页技术文档的测试集中,问答响应时间平均在2秒以内。
通过设计高质量的检索提示词,使得答案的准确率(与文档内容匹配且直接回答问题的比例)从初版的约60%提升至85%以上。
成功部署至云端,并供小范围团队成员试用,收集了第一批反馈。
3、“我”遇到的难点、坑,和解决方案。
难点一:长文档处理与上下文丢失。初期直接将整个文档扔给LLM,导致模型因上下文长度限制而无法处理,且答案质量差。
解决方案:引入RAG架构。先将长文档切分成小块(Chunks),只将与问题最相关的几个块检索出来作为上下文,完美解决了上下文长度和答案相关性的问题。
难点二:检索精度不高。有时检索出的文本片段与问题关联性不强,导致生成的答案不准确。
解决方案:优化了文本分割策略,尝试了不同的大小和重叠度,最终确定了最佳参数。同时,在构建检索链时,使用了ContextualCompressionRetriever,对检索结果进行重排序和过滤,显著提升了Top-K结果的精度。
难点三:Streamlit应用的状态管理。在聊天场景下,需要记录对话历史,而Streamlit默认每次交互都会重跑脚本。
解决方案:利用Strea