
llmware Lecture Tool 实战指南基于 Whisper 转写与 RAG 构建课程讲义智能分析工具【免费下载链接】llmwareUnified framework for building enterprise RAG pipelines with small, specialized models项目地址: https://gitcode.com/GitHub_Trending/ll/llmware本篇指南以 llmware 仓库中的 Lecture Tool 为例讲解如何用 Streamlit llmware 构建一个可持久化存储、可检索问答、可自动摘要的讲座语音分析应用。读完本文你将掌握完整的部署前置条件MongoDB、FFmpeg、五个功能页面对应的 llmware 核心 APILibrary、Parser.parse_voice、Query、Prompt、Reranker的实际调用方式与参数细节并理解从音频上传到 RAG 问答的完整数据链路。一、项目定位一个讲座语音分析应用Lecture Tool 是 llmware 仓库中位于 solutions/use_cases/lecture_tool 目录下的一个 AI 应用用于转写和分析大学讲座音频/视频。其整体架构是一个标准的 Streamlit 多页面应用入口页面 Home.py 渲染欢迎页与功能说明内容与 README 一致pages/目录下 5 个页面文件分别实现 5 个核心功能每个功能独立成文件Utils.py 提供跨页面共享的工具函数sample_audio_files/目录内置了 MP3 和 WAV 样例音频如 MIT 7.016 生物学导论、UBC Biol 112 信息流等可直接用于体验应用。根据 README该应用的五个核心功能如下并各自对应pages/中的一个文件功能页面文件1. 创建Library来分组并持久化存储转写文本pages/1_Manage_libraries.py2. 使用 Whisperllmware 内置转写音频文件并存入Librarypages/2_Manage_files.py3. 提出通用问题与针对讲座内容的问答RAGpages/3_Prompts.py4. 摘要讲座内容pages/4_Summarizer.py5. 查看所有生成的转写文本pages/5_Transcripts.py五个页面统一使用ACCOUNT_NAME lecture_tool作为 llmware 的账户名从而把所有 Library 归集在同一账户下管理这是该应用数据隔离的基本方式。二、前置条件与部署README 中列出了三项前置条件下面结合仓库内容逐一说明。2.1 Python 依赖唯一需要安装的 Python 库是streamlit和llmware可直接从 requirements.txt 安装pip install -r requirements.txt该文件内容仅有两行依赖声明llmware与streamlit无其他版本锁定。2.2 MongoDB存储转写文本MongoDB 用于持久化存储讲座转写文本。README 建议使用 llmware 仓库自带的 Docker Compose 文件仓库内为 scripts/docker/docker-compose_mongo_milvus.yaml来最便捷地部署。该 Compose 文件实际会同时启动 MongoDB 5.0.10端口27017:27017以及 Milvus 2.3.0 及其配套的 etcd、MinIO 组件数据均挂载到命名卷中llmware-mongodb、llmware-milvus等。如果只需要 MongoDB也可以只关注其中的mongodb服务定义mongodb: container_name: mongodb image: mongo:5.0.10 volumes: - llmware-mongodb:/data/db ports: - 27017:27017注释中还给出了可选的账号密码加固方式MONGO_INITDB_ROOT_USERNAME/MONGO_INITDB_ROOT_PASSWORD环境变量默认被注释掉。2.3 FFmpegMP3 到 WAV 的转换FFmpeg 用于把 MP3 文件转换为 Whisper 兼容的 WAV 文件。README 明确指出如果你打算使用 MP3 而非 WAV 文件需要先安装 FFmpeg并且安装后大概率需要重启电脑才能生效。这一点从源码可以得到印证llmware/parsers.py 中的parse_voice方法注释写明其入口是 parsing voice wav files即转写链路原生处理 WAV 格式MP3 需要先经 FFmpeg 转换为 WAV 再进入 Whisper 流程。三、启动应用与上传限制在终端中进入lecture_tool目录后运行streamlit run Home.pyStreamlit 默认支持的文件上传上限为 200 MB。需要更大幅度时使用--server.maxUploadSize参数单位为 MB例如允许上传 500 MB 的音频文件streamlit run Home.py --server.maxUploadSize 500此外README 强调两点目录约定sample_audio_files/目录提供样例 MP3 与 WAV 音频用于体验应用saved_files/目录是应用内部的临时存储位置上传文件先写入此处转写完成后删除用户不应修改其内容。这一约定与 2_Manage_files.py 中的实现完全对应页面通过os.path.join(os.getcwd(), saved_files)定义SAVED_FILES_WD上传时先把浏览器文件流写入该目录转写结束后立即os.remove删除临时文件每次批量上传前还会调用delete_all_saved_files()清空目录防止残留。四、核心链路剖析从音频到 RAG 问答下面按照数据流动顺序结合各页面源码讲解 Lecture Tool 的五个功能是如何由 llmware 的 API 支撑起来的。4.1 工具函数跨页面的数据访问基础Utils.py 只依赖 llmware 的Library与Query两个类提供两个被所有页面复用的函数get_stored_libraries()调用Library().get_all_library_cards(account_nameACCOUNT_NAME)列出该账户下所有 Library 名称。它不加载任何库只读库卡片因此代价很低适合放在页面下拉框初始化时调用get_stored_files(library_name)先load_library加载目标库再通过Query(library).get_whole_library()遍历所有文本块按file_source字段去重得到该库中所有音频文件的唯一文件名列表。这两个函数体现了应用的基本检索模型llmware 中一个 Library 包含多个文档对应多次音频上传每个文档被解析为若干文本块block块上带有file_source来源文件名等元数据页面逻辑就是围绕这些元数据做过滤。4.2 库管理创建与删除 Library1_Manage_libraries.py 提供两个操作创建Library().create_new_library(library_name, account_nameACCOUNT_NAME)库名由用户输入归属lecture_tool账户删除先check_if_library_exists确认库存在再调用Library().delete_library(library_name, confirm_deleteTrue, ...)完成删除。注意删除必须显式传confirm_deleteTrue才会真正执行这是 llmware 对破坏性操作的保护机制。页面上删除操作使用st.multiselect支持批量勾选创建操作则是单行文本输入加按钮确认。4.3 音频转写Parser.parse_voice 与 Whisper2_Manage_files.py 实现了上传音频并入库这一核心步骤。上传入口限定type[wav, mp3]且支持多文件。处理流程为清空saved_files目录delete_all_saved_files把上传文件以二进制写入saved_files调用parse_lecture_file_and_store完成转写并入库删除该临时文件向用户反馈成功。其中parse_lecture_file_and_store的关键一行是parser_output Parser(chunk_size400, max_chunk_size600, librarylibrary)\ .parse_voice(SAVED_FILES_WD, real_time_progressTrue, copy_to_libraryTrue)对照 llmware/parsers.py 中parse_voice的完整签名def parse_voice(self, input_folder, write_to_dbTrue, save_historyTrue, dupe_checkFalse, copy_to_libraryFalse, chunk_by_segmentTrue, remove_segment_markersTrue, real_time_progressTrue):可以读出该调用中各参数的含义chunk_size400/max_chunk_size600转写文本按约 400 字符分块、最大 600 字符块粒度直接决定后续检索与 RAG 的上下文窗口大小real_time_progressTrue与页面st.spinner配合实时输出转写进度copy_to_libraryTrue把解析产物写入指定 Libraryinput_folder传入的是saved_files目录parse_voice内部会遍历该目录下的全部文件源码中对os.listdir(input_folder)逐个文件交给VoiceParser处理并可选做dupe_check查重——本应用依赖上传前清空目录来规避重复。parse_voice还会在写库条件不满足时未绑定 library 或连不上数据库发出告警并把解析结果落盘到/parser_history路径这一点从 parsers.py 的分支逻辑可以确认也是排查转写成功但库里没有数据这类问题的切入点。关于 Whisper 模型从源码结构看语音解析链路的默认模型由GGUFConfigs().get_config(whisper_default_model)决定缺省为whisper-cpp-base-english见 parsers.py即 README 所说的 Whisper (built into the llmware library) 指的是 llmware 内置的 whisper.cpp 集成。4.4 双路问答通用问题与基于内容的 RAG 问答3_Prompts.py 是整个应用中最复杂的一页页面顶部定义了三类模型GENERAL_PURPOSE_MODEL phi-3-gguf # 通用问答 RAG_MODEL bling-phi-3-gguf # RAG 专用生成模型 RERANKER_MODEL jina-reranker-turbo # 语义重排序这些模型名均可在 llmware 的模型目录中找到定义jina-reranker-turbo对应 Hugging Face 仓库jinaai/jina-reranker-v1-turbo-en的重排序模型见 llmware/model_configs.py而bling-phi-3系列则是 llmware 面向 RAG 场景调优的 Phi-3 衍生模型同文件还有bling-phi-3-ov、bling-phi-3-onnx等变体。通用问题路径prompt_general_question(question)GGUFConfigs().set_config(max_output_tokens, 1000) # 限制输出长度 prompter Prompt().load_model(GENERAL_PURPOSE_MODEL, max_output999) response prompter.prompt_main(question) return response[llm_response]即加载 GGUF 格式的 phi-3 通用模型先通过GGUFConfigs全局限制最大输出 token 数再执行无上下文的直接问答适合什么是光合作用这类与讲座内容无关的问题。内容问答路径prompt_question_about_content_with_reranking(...)展示了完整的检索—重排—生成RAG 链路圈定候选文本块。根据用户在页面上选择的文件与可选主题topic组合出四种检索策略全部文件 无主题query.get_whole_library()取全库文本块全部文件 有主题query.text_query(topic)按主题做文本查询指定文件 无主题query.apply_custom_filter(query.get_whole_library(), {file_source: filename})指定文件 有主题先text_query(topic)再叠加file_source过滤。取全库或指定文件全量块时代码会把结果中的text_search键改名为text以兼容后续 RAG 调用的输入格式apply_custom_filter返回的块保持text_search命名两条路径在重排前做了统一处理。语义重排序。候选块交给重排序模型reranker_output reranker_model.inference(question, query_results, top_n10, relevance_threshold0.2)即从候选中选出 top 10 且相关性阈值 0.2 以上的块随后代码再做一次硬截断——use_top 3只取最相关的 3 个块送入生成模型以控制小模型的上下文压力。带证据的 RAG 生成。sources rag_prompter.add_source_query_results(reranker_output) response rag_prompter.prompt_with_source(question) stats rag_prompter.evidence_comparison_stats(response) ev_source rag_prompter.evidence_check_sources(response)生成后evidence_comparison_stats与evidence_check_sources分别产出答案与证据的比对统计、来源审查结果。页面上据此渲染三段内容Response答案、Evidence答案中可回溯到证据的原文句、File source来源文件名取自response[0][source_review][0][source]。最后调用rag_prompter.clear_source_materials()清空上下文避免下次提问复用旧材料。空结果保护。若圈定阶段没有命中任何块直接返回提示语 No result found. Please check to ensure your topic and file are accurate.不会带着空上下文去调用模型。整页函数均加了st.cache_data(show_spinnerFalse)装饰器对相同的问题库文件主题组合做结果缓存减少重复推理耗时。4.5 自动摘要slim-summary-tool 提取关键点4_Summarizer.py 使用SUMMARIZER_MODEL slim-summary-toolllmware 的 slim 系列摘要模型对指定文件可叠加 topic 文本过滤的转写块生成摘要summarizer_prompter Prompt().load_model(SUMMARIZER_MODEL, temperature0.0, sampleFalse) # 无主题取该文件全部块有主题先 text_query(topic) 再按 file_source 过滤 query_results query.apply_custom_filter(query.get_whole_library(), {file_source: filename}) query_results query.apply_custom_filter(query.text_query(topic), {file_source: filename}) sources Sources(summarizer_prompter).package_source(query_results, aggregate_sourceTrue) response summarizer_prompter.prompt_with_source(key points, first_source_onlyFalse, verboseTrue)几个值得注意的细节temperature0.0, sampleFalse摘要场景追求确定性输出关闭采样Sources(...).package_source(..., aggregate_sourceTrue)把多个文本块聚合成材料包first_source_onlyFalse表示对聚合后的全部材料分别生成关键点提示词就是简单的key points由 slim 摘要模型按其内置指令模式工作后处理遍历各响应的llm_response是一个字符串列表去重、剔除空串与 Not Found 开头的条目统一加上-前缀最终在页面上以要点列表呈现。4.6 查看转写原文5_Transcripts.py 的实现最轻量get_transcript(library_name, filename)遍历query.get_whole_library()把所有file_source filename的块的text_search字段拼接成完整文本返回。由于块是按文档顺序存储的简单字符串拼接即可还原该音频的完整转写。五、运行要点与适用前提小结综合 README 与源码部署和运行 Lecture Tool 时的关键要点如下环境安装llmwarestreamlit见 requirements.txt用 docker-compose_mongo_milvus.yaml 启动 MongoDB27017 端口使用 MP3 前安装 FFmpeg 并重启系统启动streamlit run Home.py大文件场景追加--server.maxUploadSize 500单位 MB数据隔离所有数据挂在lecture_tool账户下通过Utils.py中get_stored_libraries/get_stored_files两个函数统一访问临时目录saved_files仅由 2_Manage_files.py 程序化读写用户不应手工修改模型通用问答用phi-3-ggufRAG 用bling-phi-3-ggufjina-reranker-turbo重排摘要用slim-summary-tool均为 llmware 本地模型目录中的内置条目适合在本地 GPU/CPU 环境运行。这套Streamlit 页面 llmware Library 持久化 parse_voice 转写 Query 检索 重排式 RAG slim 摘要的组合本质上是一个可复制的最小 RAG 应用骨架把pages/中的模型名、分块参数chunk_size/max_chunk_size、重排参数top_n/relevance_threshold/use_top换成你自己的配置即可迁移到会议记录、播客、课堂录音等其他语音知识管理场景。【免费下载链接】llmwareUnified framework for building enterprise RAG pipelines with small, specialized models项目地址: https://gitcode.com/GitHub_Trending/ll/llmware创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考