用 Agent 智能体框架 LazyLLM 搞定个人文档RAG
本项目基于商汤科技开发的LazyLLM框架构建。LazyLLM是一个一站式AI应用开发工具,为应用开发过程中的全部环节提供了大量工具,协助开发者用极低的成本构建AI应用,并可以持续地迭代优化效果h=web#webLazyLLM和SenseNova都是商汤团队开发的产品,它们之间有很好的兼容性=Document:用于文档加载和处理Retriever:实现RAG检索功能:连接在线大语言模型:包装自定义
搞定文档总结神器:一个基于RAG的智能文档处理项目
功能简介
在学习或工作中,我们经会积累大量的文档,随着时间的推移可能已经对诸多项目的细节已经有所忘记
这个项目的目标就是创建一个智能文档总结工具,基于商汤的 LazyLLM 的RAG(检索增强生成)技术和大语言模型,自动分析文档内容并生成简洁明了的总结。
核心功能
- 智能文档总结:自动扫描指定文件夹中的文档,生成内容总结
- 时间过滤:可选择只处理最近一周内修改的文档
- Web界面交互:提供友好的Web界面,方便操作和查看结果
技术选型与环境搭建
LazyLLM框架介绍
本项目基于商汤科技开发的LazyLLM框架构建。LazyLLM是一个一站式AI应用开发工具,为应用开发过程中的全部环节提供了大量工具,协助开发者用极低的成本构建AI应用,并可以持续地迭代优化效果
具体安装步骤可以见:https://docs.lazyllm.ai/zh-cn/stable/?h=web#web
LazyLLM的安装非常简单,只需要五分钟就能完成:
pip install lazyllm
LazyLLM和SenseNova都是商汤团队开发的产品,它们之间有很好的兼容性=
大语言模型选择
本项目选用的是SenseNova平台的SenseNova-V6-Turbo模型。这是商汤科技推出的一款高性能大语言模型,具有优秀的中文理解和生成能力。
API 获取方法:https://console.sensecore.cn/aistudio/management/service-manage
然后点击服务器管理获取 API-Key
核心组件介绍
项目中使用了LazyLLM的多个核心组件:
- Document:用于文档加载和处理
- Retriever:实现RAG检索功能
- OnlineChatModule:连接在线大语言模型
- ActionModule:包装自定义处理函数
- WebModule:创建Web界面
实现步骤
文档处理模块开发
项目的核心是文档处理功能。我首先实现了几个基础函数:
- 获取一周前时间的函数:
def get_one_week_ago():
return datetime.datetime.now() - datetime.timedelta(weeks=1)
- 过滤最近一周内修改文件的函数:
def filter_recent_files(directory_path):
one_week_ago = get_one_week_ago()
recent_files = []
# 检查目录是否存在
if not os.path.exists(directory_path):
return recent_files
for filename in os.listdir(directory_path):
file_path = os.path.join(directory_path, filename)
if os.path.isfile(file_path):
try:
# 获取文件修改时间
mod_time = datetime.datetime.fromtimestamp(os.path.getmtime(file_path))
# 判断是否在一周内
if mod_time > one_week_ago:
recent_files.append(file_path)
except Exception:
# 忽略无法获取修改时间的文件
pass
return recent_files
集成RAG和大语言模型
使用LazyLLM框架来实现RAG功能,并集成了SenseNova的大语言模型:
# 创建文档对象
documents = lazyllm.Document(dataset_path=doc_path)
# 创建检索器
retriever = lazyllm.Retriever(doc=documents, group_name="CoarseChunk", similarity="bm25_chinese", topk=3)
# 创建大语言模型,使用SenseNova支持的模型
llm = lazyllm.OnlineChatModule(source="sensenova", model='SenseNova-V6-Turbo')
# 设置提示词
prompt = 'You will act as an AI question-answering assistant and complete a dialogue task. In this task, you need to provide your answers based on the given context and questions.'
llm.prompt(lazyllm.ChatPrompter(instruction=prompt, extra_keys=['context_str']))
构建智能总结功能
将上述组件整合到一个主函数中,实现完整的文档总结功能:
def smart_summary(query, doc_path, use_time_filter=False):
# 检查查询是否涉及最近一周的文档
if "最近一周" in query or "近一周" in query or "一周" in query:
use_time_filter = True
# 检查文档路径是否存在
if not os.path.exists(doc_path):
return "文档目录不存在,请检查路径设置。"
try:
# 根据时间过滤选项决定加载哪些文件
if use_time_filter:
# 只加载一周内修改的文件
file_paths = filter_recent_files(doc_path)
if not file_paths:
return "近一周内没有修改的文档。"
# 创建文档对象,使用特定文件列表
documents = lazyllm.Document(dataset_path=file_paths)
time_filter_message = "(已筛选近一周内修改的文档)"
else:
# 加载所有文档
documents = lazyllm.Document(dataset_path=doc_path)
time_filter_message = ""
# 创建检索器
retriever = lazyllm.Retriever(doc=documents, group_name="CoarseChunk", similarity="bm25_chinese", topk=3)
# 创建大语言模型,使用SenseNova支持的模型
llm = lazyllm.OnlineChatModule(source="sensenova", model='SenseNova-V6-Turbo')
# 设置提示词
prompt = 'You will act as an AI question-answering assistant and complete a dialogue task. In this task, you need to provide your answers based on the given context and questions.'
llm.prompt(lazyllm.ChatPrompter(instruction=prompt, extra_keys=['context_str']))
# 检索相关文档
docs_node_list = retriever(query=query)
# 生成回答
context_str = "".join([node.get_content() for node in docs_node_list])
if not context_str:
if use_time_filter:
return "近一周内没有找到与查询相关的文档内容。"
else:
return "未找到与查询相关的文档内容。"
res = llm({"query": query, "context_str": context_str})
# 添加时间过滤信息到结果中
if time_filter_message and use_time_filter:
res = time_filter_message + "\n" + res
return res
except Exception as e:
return f"处理文档时出错: {str(e)}. 请确保文档目录中包含有效的文档文件,并且LazyLLM能够访问该目录。"
创建Web界面
def create_web_interface():
# 使用ActionModule包装smart_summary函数作为后端处理逻辑
chat = lazyllm.ActionModule(smart_summary)
# 创建 Web 界面,添加文档路径输入和时间过滤选项
web = lazyllm.WebModule(
chat,
port=23333,
components={
chat: [
('doc_path', 'Text', ''), # 将默认值设为空字符串,让用户手动输入
('use_time_filter', 'Checkbox', False)
]
}
)
return web
前端文档路径输入功能
Web界面中,设计了一个文档路径输入框,用户可以灵活地指定要处理的文档文件夹路径。
在前端界面中,您会看到一个文本输入框,专门用于输入文档文件夹的完整路径。比如在macOS系统中,您可以输入类似/Users/yourname/Documents/my_papers
这样的路径;在Windows系统中,则可以输入类似C:\Users\yourname\Documents\my_papers
的路径。
当输入正确的文档路径并提交查询后,系统会自动扫描该文件夹中的所有文档,并根据您是否勾选"时间过滤"选项来决定是处理所有文档还是仅处理最近一周内修改的文档。这个设计让系统变得更加灵活和实用,能够适应不同用户的文档管理习惯。
主函数
if __name__ == "__main__":
# 启动 Web 界面
web_interface = create_web_interface()
web_interface.start().wait()
这段代码会启动Web服务,通过浏览器访问http://localhost:23333
来使用这个文档总结工具
获取项目地址:https://gitcode.com/umeikou/LazyLLM_Web
总结
这个项目虽然不大,但涵盖了从需求分析、技术选型到编码实现的完整开发流程。通过集成RAG技术和大语言模型,我们实现了一个实用的智能文档总结工具。
在开发过程中,我深刻体会到了模块化设计的重要性,以及如何将复杂的功能分解为简单的组件。同时,通过Web界面的实现,也让这个工具变得更加用户友好。
如果你也经常需要处理大量文档,不妨试试这个工具,或许能帮你节省不少时间!
更多推荐
所有评论(0)