一、写在前面:为什么我们需要自动摘要?
在技术团队日常协作中,我们会频繁编写和共享大量 Markdown 格式的文档,如:
- 项目说明书
- 接口文档 / 接口规范
- 会议纪要
- 知识库文档
但这些文档动辄上千行,想快速了解其中关键内容十分困难,特别是新成员加入、跨团队协作时,查阅效率非常低。
如今随着 GPT-4/GPT-3.5 等大模型的兴起,我们完全可以通过 AI 自动提取这些文档的核心内容。搭配 LangChain,构建一个智能摘要生成工具,简直不要太高效!
二、核心思路与技术选型
我们这次要做的是一个 本地 Markdown 文档摘要生成器,支持中英文自动识别,插入摘要内容到原文中指定位置(如 Front Matter 后)。
整体流程如下:
✅ 摘要生成流程:
- 读取 Markdown 文件内容
- 通过标题判断文档语言(中文/英文)
- 构建多语言提示模板(Prompt)
- 调用 OpenAI API 生成摘要内容
- 将摘要插入到 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 服务,进一步赋能你的知识工作流!