搞定文档总结神器:一个基于RAG的智能文档处理项目

功能简介

在学习或工作中,我们经会积累大量的文档,随着时间的推移可能已经对诸多项目的细节已经有所忘记

这个项目的目标就是创建一个智能文档总结工具,基于商汤的 LazyLLM 的RAG(检索增强生成)技术和大语言模型,自动分析文档内容并生成简洁明了的总结。

核心功能

  1. 智能文档总结:自动扫描指定文件夹中的文档,生成内容总结
  2. 时间过滤:可选择只处理最近一周内修改的文档
  3. 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的多个核心组件:

  1. Document:用于文档加载和处理
  2. Retriever:实现RAG检索功能
  3. OnlineChatModule:连接在线大语言模型
  4. ActionModule:包装自定义处理函数
  5. WebModule:创建Web界面

实现步骤

文档处理模块开发

项目的核心是文档处理功能。我首先实现了几个基础函数:

  1. 获取一周前时间的函数
def get_one_week_ago():
    return datetime.datetime.now() - datetime.timedelta(weeks=1)
  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界面的实现,也让这个工具变得更加用户友好。

如果你也经常需要处理大量文档,不妨试试这个工具,或许能帮你节省不少时间!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐