
在实际工作中我们常常会遇到一些重复性的、需要特定格式的文档处理任务比如将一份技术文档快速整理成演示文稿。对于不熟悉编程的同事或内容创作者来说手动操作费时费力。最近一个名为mewamew/my_ai_town的开源项目在 GitHub 上引起了我的注意它展示了一种利用 AI 代理构建个性化工作流的思路。虽然其原始目标是构建一个“AI小镇”游戏但其核心思想——通过编排不同的 AI 工具来完成复杂任务——完全可以迁移到办公自动化场景。本文将带你实践一个零代码的改造过程利用这个开源项目的核心思想结合 GitHub 上丰富的开源工具构建一个专属于你的“PPT 内容助手”。这个助手能帮你自动分析 Markdown 格式的技术文档并生成结构清晰、内容匹配的 PPT 大纲或草稿。整个过程无需编写任何代码你只需要理解几个关键概念并像搭积木一样配置几个现成的服务。无论你是项目经理、技术写作者还是学生都能通过本文掌握一套将开源项目“为我所用”的实用方法。1. 理解核心概念AI 代理与工具编排在开始动手之前我们需要先理解两个关键概念AI 代理和工具编排。这是理解后续所有操作的基础。AI 代理在这里不是一个具体的软件而是一个设计模式。你可以把它想象成一个虚拟的、具备特定能力的“助手”。这个助手本身可能不直接生成内容但它知道在什么情况下该去调用什么“工具”来完成任务。例如一个“文档分析代理”知道当收到一份 Markdown 文档时应该调用“文本解析工具”来提取标题和列表。工具编排则是定义这些代理如何协同工作的流程。它回答了“先做什么后做什么如果失败了怎么办”的问题。在我们的场景里流程可能是1. 接收用户上传的 Markdown 文件2. 调用代理 A 分析文档结构3. 调用代理 B 根据结构生成 PPT 大纲4. 将大纲返回给用户。my_ai_town这类项目之所以有改造潜力正是因为它提供了一个实现代理和工具编排的框架或示例。我们不需要从零发明轮子而是学习它如何连接不同的组件比如语言模型、知识库、动作执行器然后替换成我们需要的组件比如 Markdown 解析器、PPT 模板引擎。注意本文的“零代码”指的是不要求读者自己编写 Python、Java 等业务逻辑代码。我们仍会使用 YAML 进行配置使用命令行启动服务这属于运维和配置的范畴是不可避免的。2. 环境准备与工具选型我们的目标是搭建一个本地可运行的服务它接收输入经过处理输出结果。为了实现“Markdown 转 PPT 大纲”我们需要以下几个核心组件并全部选择开源、易用的方案。2.1 基础运行环境首先确保你的电脑上已经安装了以下软件这是所有后续操作的基础。Docker 与 Docker Compose这是实现“零代码”集成的关键。我们将通过 Docker 容器来运行各个服务避免复杂的本地环境配置。请访问 Docker 官网下载适合你操作系统Windows/macOS/Linux的 Desktop 版本进行安装。安装后在终端运行docker --version和docker compose version检查是否安装成功。Git用于从 GitHub 克隆开源项目。通常系统会自带或可从官网下载。终端运行git --version验证。一个文本编辑器如 VS Code、Sublime Text 或 Notepad用于编辑配置文件。2.2 核心服务组件选型接下来我们为流程的每个环节挑选一个具体的开源工具。下表列出了我们的选型及理由环节工具选型项目地址/说明选择理由流程编排引擎Docker ComposeDocker 内置轻量通过 YAML 定义服务依赖和启动顺序完美契合“搭积木”思路。文档解析与处理Pandoc通用文档转换工具业界标准能完美将 Markdown 转换为多种结构化格式如 JSON、HTML便于后续处理。AI 推理/内容生成Ollamahttps://ollama.com/可在本地离线运行多种大型语言模型如 Llama 3, Qwen无需 API 密钥隐私性好。任务调度与接口简单的 Python Flask 应用自行编写最小化脚本作为“胶水”代码接收请求调用 Pandoc 和 Ollama返回结果。由于逻辑极简我们直接提供代码。前端界面可选HTML 表单静态页面一个简单的上传文件表单用于触发后端流程。你可能注意到了我们没有直接使用my_ai_town的代码。这是因为其代码可能耦合了游戏逻辑。我们的策略是借鉴其思想但选用更通用、更简单的组件来重新实现我们自己的流程。这是改造开源项目的常见且有效的方法。3. 构建“PPT 内容助手”工作流现在我们将上述组件组合起来形成一个完整的工作流。整个系统的架构如下图所示文字描述用户 --(上传 Markdown)-- [Web 前端] --(HTTP POST)-- [Flask 后端] [Flask 后端] --(调用)-- [Pandoc (解析为JSON)] --(提取结构)-- [Flask 后端] [Flask 后端] --(构造Prompt)-- [Ollama (本地LLM)] --(生成大纲)-- [Flask 后端] [Flask 后端] --(返回结果)-- [Web 前端] -- 用户3.1 创建项目目录结构首先在本地创建一个项目文件夹并建立如下目录结构。清晰的目录是管理多服务项目的基础。my-ppt-assistant/ ├── docker-compose.yml # 服务编排定义文件 ├── app/ # 后端 Flask 应用 │ ├── Dockerfile │ ├── requirements.txt │ └── app.py ├── web/ # 前端静态页面可选 │ └── index.html └── samples/ # 存放示例 Markdown 文档 └── sample_doc.md3.2 编写后端“胶水”代码 (app.py)在app/app.py中我们将编写一个简单的 Flask 应用。它的作用是提供一个上传接口。调用系统命令使用 Pandoc 处理上传的文件。将 Pandoc 输出的 JSON 结构整理成给 AI 的提示词。调用本地 Ollama 服务的 API获取生成的 PPT 大纲。将大纲返回。# app/app.py import os import subprocess import json import requests from flask import Flask, request, jsonify, render_template_string app Flask(__name__) UPLOAD_FOLDER /tmp/uploads os.makedirs(UPLOAD_FOLDER, exist_okTrue) app.config[UPLOAD_FOLDER] UPLOAD_FOLDER # Ollama 服务的地址在 Docker Compose 网络内通过服务名访问 OLLAMA_URL http://ollama:11434/api/generate HTML_TEMPLATE !doctype html html headtitlePPT 内容助手/title/head body h2上传 Markdown 文档生成 PPT 大纲/h2 form action/generate methodpost enctypemultipart/form-data input typefile namefile accept.md,.markdown required button typesubmit生成大纲/button /form {% if result %} hr h3生成的 PPT 大纲/h3 pre stylebackground:#f4f4f4;padding:1em;{{ result }}/pre {% endif %} /body /html app.route(/) def index(): return render_template_string(HTML_TEMPLATE) app.route(/generate, methods[POST]) def generate_ppt_outline(): if file not in request.files: return jsonify({error: 没有上传文件}), 400 file request.files[file] if file.filename : return jsonify({error: 未选择文件}), 400 # 1. 保存上传的文件 filepath os.path.join(app.config[UPLOAD_FOLDER], file.filename) file.save(filepath) try: # 2. 使用 Pandoc 将 Markdown 转换为 JSON 结构 # 命令解释-t json 表示输出为 JSON 格式-f markdown 表示输入是 Markdown result subprocess.run( [pandoc, filepath, -f, markdown, -t, json], capture_outputTrue, textTrue, checkTrue ) doc_json json.loads(result.stdout) # 3. 从 JSON 中提取标题和列表项构造一个简化的文本摘要 # 这是一个简化的解析器实际可以根据 Pandoc 的 JSON AST 进行更复杂的解析 def extract_structure(blocks, depth0): structure [] for block in blocks: if block[t] Header: level block[c][0] text .join([span[c] for span in block[c][2] if span[t] Str]) structure.append(f{# * level} {text}) elif block[t] BulletList or block[t] OrderedList: for item in block[c]: # 递归处理列表项中的内容 structure.extend(extract_structure(item, depth1)) # 可以添加更多类型的处理如 Paragraph, CodeBlock 等 return structure doc_structure extract_structure(doc_json[blocks]) doc_summary \n.join(doc_structure[:20]) # 取前20行作为摘要避免过长 # 4. 构造发送给 Ollama 的提示词 (Prompt) prompt f 你是一个专业的PPT制作助手。请根据以下技术文档的结构摘要生成一份PPT演示文稿的大纲。 大纲要求 1. 包含封面页、目录页、内容页根据文档逻辑分章节、总结页。 2. 每页PPT用一个“- ”开头简要说明该页的主题和核心内容要点。 3. 内容页的划分应遵循原文档的章节逻辑。 4. 大纲语言为中文。 技术文档结构摘要 {doc_summary} 请直接输出PPT大纲不要添加额外的解释 # 5. 调用 Ollama API ollama_payload { model: llama3.2, # 请确保你已通过 ollama pull llama3.2 拉取了这个模型 prompt: prompt, stream: False } response requests.post(OLLAMA_URL, jsonollama_payload, timeout60) response.raise_for_status() ai_response response.json() # 6. 返回结果 return render_template_string(HTML_TEMPLATE, resultai_response.get(response, 无响应)) except subprocess.CalledProcessError as e: return jsonify({error: fPandoc 处理失败: {e.stderr}}), 500 except requests.exceptions.RequestException as e: return jsonify({error: f调用 AI 模型失败: {e}}), 500 except Exception as e: return jsonify({error: f处理过程出错: {e}}), 500 finally: # 清理临时文件 if os.path.exists(filepath): os.remove(filepath) if __name__ __main__: app.run(host0.0.0.0, port5000, debugFalse)3.3 配置后端依赖与 Docker 镜像在app/目录下创建requirements.txt和Dockerfile。# app/requirements.txt Flask2.3.3 requests2.31.0# app/Dockerfile FROM python:3.11-slim # 安装 Pandoc这是我们的核心工具之一 RUN apt-get update apt-get install -y pandoc rm -rf /var/lib/apt/lists/* WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD [python, app.py]3.4 编写核心编排文件 (docker-compose.yml)这是“搭积木”的蓝图定义了三个服务Flask 后端、Ollama 和前端可选这里我们将前端集成到 Flask 里了。# docker-compose.yml version: 3.8 services: ollama: image: ollama/ollama:latest container_name: ppt-assistant-ollama ports: - 11434:11434 # 将 Ollama 的 API 端口映射到主机方便调试 volumes: - ollama_data:/root/.ollama # 持久化存储模型数据 # 注意首次启动后需要进入容器执行 ollama pull llama3.2 拉取模型 # 命令docker exec -it ppt-assistant-ollama ollama pull llama3.2 app: build: ./app container_name: ppt-assistant-app ports: - 5000:5000 depends_on: - ollama # 允许容器内访问宿主机网络有时 Pandoc 需要此配置处理字体等 network_mode: host # 或者使用默认的 bridge 网络并链接 ollama 服务 # networks: # - default environment: - OLLAMA_HOSTollama:11434 # 告诉 Flask 应用 Ollama 服务的位置 volumes: ollama_data:3.5 准备示例 Markdown 文档在samples/sample_doc.md中创建一个简单的技术文档用于测试。# 项目方案新一代容器化部署平台 ## 1. 项目背景与目标 当前部署流程存在手动操作多、环境不一致等问题。本项目旨在构建一个全自动化的容器部署平台。 ### 1.1 现状分析 - 部署依赖手工脚本。 - 测试与生产环境差异大。 - 回滚流程复杂。 ### 1.2 核心目标 - 实现一键部署与回滚。 - 保证环境一致性。 - 提升发布效率 50% 以上。 ## 2. 系统架构设计 平台采用微服务架构核心组件包括 - **编排引擎**基于 Kubernetes。 - **镜像仓库**私有 Harbor。 - **CI/CD 流水线**Jenkins GitLab。 ## 3. 关键技术选型 详细对比了 Docker Swarm 与 Kubernetes最终选择 K8s 因其生态更完善。 ## 4. 实施路线图 分三期完成第一期实现基础镜像构建与部署。4. 启动服务与验证效果所有配置完成后我们可以启动整个系统并进行验证。4.1 启动服务在项目根目录my-ppt-assistant/下执行以下命令# 启动所有服务在后台运行 docker compose up -d # 查看服务日志确认启动无误 docker compose logs -f当你看到app服务输出* Running on all addresses (0.0.0.0)并且ollama服务没有报错时说明服务启动成功。首次运行需要初始化 Ollama 模型打开一个新的终端。执行docker exec -it ppt-assistant-ollama ollama pull llama3.2。这会从网络下载模型耗时取决于你的网速。等待下载完成出现“success”提示。4.2 访问与测试打开浏览器访问http://localhost:5000。你会看到一个简单的文件上传界面。点击“选择文件”上传我们准备好的samples/sample_doc.md。点击“生成大纲”按钮。后端服务会依次执行以下动作你可以在docker compose logs -f的日志中看到过程接收文件。调用 Pandoc 解析 Markdown。构造提示词。向本地的 Ollama 服务发送请求。接收 AI 生成的大纲并返回页面。4.3 预期结果页面会返回一个结构化的 PPT 大纲内容基于你上传的文档。以下是一个可能的输出示例实际结果因模型生成会有差异- 封面页项目方案新一代容器化部署平台 - 目录页 - 项目背景与目标 - 系统架构设计 - 关键技术选型 - 实施路线图 - 内容页 1项目背景与目标 - 阐述当前手动部署的痛点及项目核心目标提升效率50% - 内容页 2现状分析 - 详细说明手工脚本、环境差异、复杂回滚三大问题 - 内容页 3核心目标详解 - 实现一键部署、保证环境一致性、提升效率 - 内容页 4系统架构总览 - 介绍微服务架构及三大核心组件K8s, Harbor, JenkinsGitLab - 内容页 5编排引擎Kubernetes - 说明选择 K8s 作为编排核心的原因 - 内容页 6镜像仓库Harbor - 介绍私有镜像仓库的作用与选型 - 内容页 7CI/CD 流水线 - 说明 Jenkins 与 GitLab 如何协同实现自动化 - 内容页 8技术选型对比 - 对比 Docker Swarm 与 Kubernetes突出 K8s 生态优势 - 内容页 9实施路线图 - 分三期推进第一期聚焦基础镜像与部署 - 总结页项目总结与预期价值 - 重申平台将带来的自动化、一致性及效率提升价值这个大纲已经具备了 PPT 的完整结构可以直接用于指导 PPT 制作或者作为初稿导入到 PowerPoint、Keynote 或在线演示工具中。5. 常见问题排查与优化在搭建和运行过程中你可能会遇到一些问题。以下是常见问题的排查路径。5.1 服务启动失败问题现象可能原因检查与解决docker compose up报错docker-compose.yml语法错误或路径错误1. 运行docker compose config检查语法。2. 确认Dockerfile和app.py在正确的app/目录下。Flask 应用启动失败提示端口占用本地 5000 端口已被其他程序使用1. 修改docker-compose.yml中app服务的端口映射如“8080:5000”然后访问http://localhost:8080。2. 使用lsof -i:5000(macOS/Linux) 或netstat -ano | findstr :5000(Windows) 查找并结束占用进程。Ollama 容器启动后立即退出可能是端口冲突或权限问题1. 检查 11434 端口是否被占用。2. 查看详细日志docker compose logs ollama。5.2 功能流程报错问题现象可能原因检查与解决上传文件后页面报“Pandoc 处理失败”1. Pandoc 未成功安装到容器中。2. 上传的文件不是有效 Markdown。1. 进入应用容器检查docker exec -it ppt-assistant-app which pandoc。2. 确认Dockerfile中apt-get install pandoc命令执行成功。3. 验证上传的.md文件格式是否正确。页面长时间等待后报“调用 AI 模型失败”1. Ollama 服务未启动或模型未加载。2. 网络不通。1. 确认 Ollama 容器在运行docker compose ps。2.确认模型已下载docker exec -it ppt-assistant-ollama ollama list。3. 在应用容器内测试连接docker exec -it ppt-assistant-app curl http://ollama:11434/api/tags。AI 生成的内容不相关或质量差1. 提示词Prompt不够清晰。2. 选择的模型不适合该任务。1. 优化app.py中的prompt变量给出更明确的指令和格式示例。2. 尝试其他模型如qwen:7b使用ollama pull qwen:7b下载并修改app.py中的model参数。5.3 性能与使用优化首次生成慢Ollama 需要在首次请求时加载模型到内存后续请求会快很多。模型内存占用llama3.2模型约占用 4GB 内存。确保你的 Docker 内存分配足够通常 Docker Desktop 默认 2GB需在设置中调高。如果内存不足可尝试更小的模型如llama3.2:1b。处理长文档示例中只提取了文档前20行结构。对于长文档可以优化extract_structure函数提取更多层级信息或者分章节发送给 AI 处理。改进输出格式目前输出是纯文本。你可以修改提示词让 AI 输出 JSON 格式包含每页的标题、要点、甚至建议的图表类型方便后续自动化处理。6. 扩展方向与最佳实践你现在已经拥有了一个可工作的“PPT 内容助手”原型。基于此你可以从以下几个方向进行扩展使其更加强大和实用。6.1 功能扩展集成 PPT 模板引擎将生成的大纲与python-pptx或libreoffice的 API 结合直接生成.pptx文件。这需要编写额外的代码来将 AI 输出的结构化内容填充到 PPT 模板的相应位置。支持更多输入格式修改后端使其支持 Word (docx)、PDF 等格式。可以使用pandoc的更多参数或pdfminer等库来实现。添加历史记录与缓存引入一个简单的数据库如 SQLite将用户上传的文件哈希、生成的大纲和时间戳存储起来避免对相同内容重复处理。实现更复杂的代理逻辑参考my_ai_town等项目引入 LangChain 或 AutoGen 等框架将“解析文档”、“生成大纲”、“美化建议”等步骤拆分成独立的、可复用的代理使流程更灵活。6.2 生产环境考量当前配置仅适用于学习和个人使用。若要用于团队或生产环境需考虑以下几点安全性对上传文件进行病毒扫描和类型校验。为 Flask 应用添加请求速率限制和身份验证。避免在提示词中泄露敏感信息。可靠性为 Flask 和 Ollama 服务配置进程守护如使用 Docker 的restart: always策略。添加监控和日志收集如 ELK 栈便于排查问题。考虑为 Ollama 设置多个副本并使用负载均衡。性能对于高频使用可以将 Ollama 模型加载到 GPU 以加速推理。对生成的大纲结果进行缓存。考虑使用消息队列如 Redis将上传请求与生成任务异步解耦。6.3 改造开源项目的通用思路通过这个实践我们可以总结出改造 GitHub 开源项目为自己工具的通用思路明确需求不要被项目原始目标迷惑。先想清楚自己要解决什么问题。解构项目阅读项目源码和文档理解其核心架构如事件驱动、代理模型和关键组件如用了哪些 API、工具。抽取思想放弃复杂的、与需求无关的代码只保留其设计思想和工作流程。例如我们从my_ai_town学到的是“用编排的方式串联 AI 工具”。选型替换用更简单、更贴近自己需求的成熟开源组件替换原项目中的复杂部分。我们用Flask Pandoc Ollama替换了可能的游戏引擎和复杂代理逻辑。搭建原型使用Docker Compose等工具快速将新组件组合起来形成一个最小可行产品。迭代优化基于原型运行反馈逐步优化提示词、流程、UI 和性能。这个从“使用工具”到“创造工具”的过程正是开发者能力成长的关键一步。它不要求你一开始就精通所有代码而是考验你分析、拆解和重组现有资源的能力。