🚀5 分钟实现 Markdown 智能摘要生成器:LangChain + OpenAI 实战教程

一、写在前面:为什么我们需要自动摘要?

在技术团队日常协作中,我们会频繁编写和共享大量 Markdown 格式的文档,如:

  • 项目说明书
  • 接口文档 / 接口规范
  • 会议纪要
  • 知识库文档

但这些文档动辄上千行,想快速了解其中关键内容十分困难,特别是新成员加入、跨团队协作时,查阅效率非常低。

如今随着 GPT-4/GPT-3.5 等大模型的兴起,我们完全可以通过 AI 自动提取这些文档的核心内容。搭配 LangChain,构建一个智能摘要生成工具,简直不要太高效!

二、核心思路与技术选型

我们这次要做的是一个 本地 Markdown 文档摘要生成器,支持中英文自动识别,插入摘要内容到原文中指定位置(如 Front Matter 后)。

整体流程如下:

✅ 摘要生成流程:

  1. 读取 Markdown 文件内容
  2. 通过标题判断文档语言(中文/英文)
  3. 构建多语言提示模板(Prompt)
  4. 调用 OpenAI API 生成摘要内容
  5. 将摘要插入到 Markdown 的 Front Matter 之后

🛠 技术选型:

技术组件 说明
LangChain 大模型应用开发框架,封装提示、模型、链式组合等
OpenAI API 提供 GPT 模型能力,生成文档摘要
python-dotenv 管理本地环境变量(API Key、代理地址)

三、项目实现步骤

1️⃣ 环境准备

bash 复制代码
pip install langchain-openai python-dotenv

在根目录添加 .env 文件,由于网络的原因这里我使用的是openai代理地址和key:

bash 复制代码
OPENAI_API_KEY=sk-xxx
OPENAI_API_BASE=https://api.openai-proxy.org/v1

2️⃣ 主程序代码(完整可运行)

python 复制代码
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
import os
import re
from dotenv import load_dotenv

# 加载环境变量(从项目根目录的.env文件)
load_dotenv()

# 配置参数
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
# 由于网络的原因这里我使用的是openai代理地址和key
OPENAI_API_BASE = os.getenv("OPENAI_API_BASE", "https://api.openai-proxy.org/v1")
MD_FILE_PATH = "example.md"

# 检查必要的环境变量
if not OPENAI_API_KEY:
    raise ValueError("请在项目根目录的.env文件中设置 OPENAI_API_KEY")

def detect_language(text):
    """
    通过分析markdown文件中的标题来判断文档语言
    Args:
        text: markdown文件内容
    Returns:
        str: 语言代码 ('zh' 或 'en')
    """
    # 提取所有markdown标题(从#到######)
    headers = re.findall(r'^#{1,6}\s+(.+)$', text, re.MULTILINE)
    
    if not headers:
        return 'en'  # 如果没有找到标题,默认使用英文
    
    # 统计标题中的中文字符
    chinese_chars = 0
    total_chars = 0
    
    for header in headers:
        # 清理标题中的markdown格式(如*、_、~等)
        header = re.sub(r'[`*_~]', '', header)
        chinese_chars += len(re.findall(r'[\u4e00-\u9fff]', header))
        total_chars += len(re.sub(r'\s', '', header))
    
    print(f"找到 {len(headers)} 个标题")
    print(f"标题中的中文字符数: {chinese_chars}")
    print(f"标题中的总字符数: {total_chars}")
    
    # 如果标题中超过30%是中文,则判定为中文文档
    if total_chars > 0 and chinese_chars / total_chars > 0.3:
        return 'zh'
    return 'en'

def get_language_prompt(lang):
    """
    根据语言获取对应的提示语
    Args:
        lang: 语言代码
    Returns:
        str: 对应语言的提示语
    """
    prompts = {
        'en': "You are a helpful assistant that creates concise summaries of markdown content in English. "
              "Focus on the main points and key information while maintaining the essential context.",
        'zh': "你是一个帮助生成中文markdown内容摘要的助手。"
              "请关注主要内容要点和关键信息,同时保持必要的上下文。",
        'ja': "あなたはmarkdownコンテンツの簡潔な要約を作成するアシスタントです。"
              "主要なポイントと重要な情報に焦点を当てながら、必要な文脈を維持してください。",
        'ko': "당신은 markdown 콘텐츠의 간결한 요약을 생성하는 도우미입니다. "
              "주요 포인트와 핵심 정보에 초점을 맞추면서 필수적인 맥락을 유지하세요."
    }
    return prompts.get(lang, prompts['en'])  # 如果语言不支持,默认使用英文

def insert_summary_after_front_matter(content, summary):
    """
    在YAML front matter后插入摘要
    Args:
        content: 原始markdown内容
        summary: 生成的摘要
    Returns:
        str: 插入摘要后的完整内容
    """
    # 查找front matter的结束位置(第二个---标记)
    front_matter_end = content.find('---', content.find('---') + 3)
    if front_matter_end == -1:
        # 如果没有找到front matter,则在文件开头插入摘要
        return f"## Summary\n{summary}\n\n{content}"
    
    # 在front matter后插入摘要
    return content[:front_matter_end + 3] + f"\n\n## Summary\n{summary}\n\n" + content[front_matter_end + 3:]

def summarize_markdown(md_file_path):
    """
    生成markdown文件的摘要并插入到文件中
    Args:
        md_file_path: markdown文件路径
    Returns:
        bool: 操作是否成功
    """
    # 初始化OpenAI模型
    llm = ChatOpenAI(
        model="gpt-3.5-turbo",
        temperature=0.7,
        api_key=OPENAI_API_KEY,
        base_url=OPENAI_API_BASE
    )

    try:
        # 读取markdown文件
        with open(md_file_path, 'r', encoding='utf-8') as file:
            content = file.read()

        # 检测文档语言
        lang = detect_language(content)
        print(f"检测到的语言: {lang}")

        # 创建对应语言的提示模板
        prompt = ChatPromptTemplate.from_messages([
            ("system", get_language_prompt(lang)),
            ("user", "Please summarize the following markdown content:\n\n{text}")
        ])

        # 创建处理链
        chain = prompt | llm

        # 生成摘要
        summary = chain.invoke({"text": content})

        # 在front matter后插入摘要并写回文件
        new_content = insert_summary_after_front_matter(content, summary.content)
        with open(md_file_path, 'w', encoding='utf-8') as file:
            file.write(new_content)

        print(f"摘要已成功添加到 {md_file_path}")
        return True

    except Exception as e:
        print(f"处理文件时出错: {str(e)}")
        return False

if __name__ == "__main__":
    if os.path.exists(MD_FILE_PATH):
        summarize_markdown(MD_FILE_PATH)
    else:
        print("文件未找到!")

四、使用效果展示

示例原始文档:

markdown 复制代码
---
title: Spring AI 入门指南
date: 2024-05-01
---

# 什么是 Spring AI?

Spring AI 是 Spring 推出的大模型接入框架...

# 如何安装?

使用以下命令安装依赖项:

自动生成摘要后:

markdown 复制代码
---
title: Spring AI 入门指南
date: 2024-05-01
---

## Summary
Spring AI 是 Spring 生态中用于简化大模型调用的库。本文简要介绍了其安装方式和基本用法,适合初学者快速入门。

# 什么是 Spring AI?

Spring AI 是 Spring 推出的大模型接入框架...

# 如何安装?

使用以下命令安装依赖项:

五、更多拓展建议

该工具虽聚焦 Markdown 摘要生成,未来可以支持更多场景下的扩展:

功能 实现建议
✅ 批量处理多个 Markdown 文件 使用 glob 模块遍历目录
✅ 支持 PDF / HTML 摘要 接入 LangChain 的 PDFLoader / BeautifulSoupLoader
✅ 多语言摘要支持扩展 添加更多语言模板,如德语、法语等
✅ 接入知识问答系统 与向量数据库结合,实现 RAG 检索问答

六、总结

通过 LangChain + OpenAI API 的组合,我们可以低成本地实现一个本地 Markdown 摘要生成工具。它能帮你:

  • 快速理解文档内容
  • 减少重复阅读时间
  • 为文档系统添加自动摘要能力

💡 未来,你甚至可以将这个工具打包成 VSCode 插件、GitHub Action 或 Web 服务,进一步赋能你的知识工作流!

相关推荐
杂雾无尘9 小时前
用 Trae 打造全栈项目魔法师 - 让项目初始化不再是噩梦
aigc·openai·ai编程
惜鸟10 小时前
# LLM统一网关:LiteLLM 详细介绍(实践篇)
后端·openai
金汐脉动18 小时前
实践指南:从零开始搭建RAG驱动的智能问答系统
langchain
哪吒编程1 天前
重磅更新! 基于Gemini 2.5 打造的AI智能体PlantUML-X上线!
openai·gemini
量子位1 天前
大模型公司挖墙脚哪家强?报告:Anthropic 人才吸引力是 OpenAI 的 8 倍,留存率达 80%
openai·ai编程
爱吃的小肥羊1 天前
ChatGPT又双叒叕升级了,AI编程能联网,记忆功能免费用!
chatgpt·openai
MrGaoGang1 天前
AI应用开发:LangGraph+MCP
前端·人工智能·langchain
西部荒野子2 天前
LangChain.js 中的 Runnable 系统
langchain
大尾巴青年2 天前
06 一分钟搞懂langchain的Agent是如何工作的
langchain·llm