用Python和LangChain创建自动化新闻摘要工具

云信安装大师
90
AI 质量分
2 5 月, 2025
3 分钟阅读
0 阅读

用Python和LangChain创建自动化新闻摘要工具

引言

在信息爆炸的时代,每天都有大量新闻产生。手动阅读和总结这些新闻耗时耗力。本文将教你如何使用Python和LangChain框架创建一个自动化新闻摘要工具,帮助你快速获取关键信息。

准备工作

环境要求

  • Python 3.7+
  • pip包管理工具
  • OpenAI API密钥(或其他LLM服务API密钥)

安装依赖

代码片段
pip install langchain openai newspaper3k python-dotenv

获取API密钥

  1. 访问OpenAI官网注册账号
  2. 在API Keys页面创建新的密钥
  3. 将密钥保存在项目目录下的.env文件中:
代码片段
OPENAI_API_KEY=你的API密钥

实现步骤

1. 创建基础脚本框架

代码片段
# news_summarizer.py
import os
from dotenv import load_dotenv
from newspaper import Article
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate

# 加载环境变量
load_dotenv()

def summarize_news(url: str) -> str:
    """从给定URL提取并总结新闻内容"""
    pass

if __name__ == "__main__":
    news_url = input("请输入新闻URL: ")
    summary = summarize_news(news_url)
    print("\n新闻摘要:")
    print(summary)

2. 实现新闻内容提取功能

使用newspaper3k库从URL提取新闻内容:

代码片段
def extract_news_content(url: str) -> tuple:
    """从URL提取新闻标题和正文内容"""
    article = Article(url)

    try:
        article.download()
        article.parse()
        return article.title, article.text
    except Exception as e:
        print(f"提取新闻内容时出错: {e}")
        return None, None

注意事项
newspaper3k可能无法解析所有网站,对于复杂网页可能需要额外处理
– 有些网站可能有反爬机制,可以添加user-agent等请求头

3. 设计摘要提示模板

使用LangChain的提示模板功能:

代码片段
# 定义摘要提示模板(放在文件顶部)
SUMMARY_PROMPT_TEMPLATE = """
你是一位专业的新闻编辑,请根据以下内容生成简洁的摘要:

标题: {title}

正文:
{content}

要求:
1. 用中文总结核心内容(100字以内)
2. 提取3个关键点(每个点不超过20字)
3. 如果涉及重要数据或日期,必须包含在摘要中

格式要求:
【核心摘要】...
【关键点】1...;2...;3...
"""

4. 完整实现摘要功能

代码片段
def summarize_news(url: str) -> str:
    """从给定URL提取并总结新闻内容"""
    # Step1: 提取原始内容
    title, content = extract_news_content(url)
    if not content:
        return "无法获取新闻内容"

    # Step2: 初始化LLM模型(使用gpt-3.5-turbo平衡成本与效果)
    llm = ChatOpenAI(
        model_name="gpt-3.5-turbo",
        temperature=0.3,   # 较低温度使输出更确定性
        max_tokens=500     # 限制输出长度
    )

    # Step3: 创建提示模板并调用模型
    prompt_template = ChatPromptTemplate.from_template(SUMMARY_PROMPT_TEMPLATE)
    messages = prompt_template.format_messages(title=title, content=content[:4000]) # API限制上下文长度

    try:
        response = llm(messages)
        return response.content.strip()
    except Exception as e:
        return f"生成摘要时出错: {e}"

代码解释
1. temperature=0.3 – 控制生成文本的随机性,值越低输出越确定性和保守
2. content[:4000] – GPT-3.5有上下文长度限制,截取前4000字符确保不超限

进阶优化

A. 批量处理多个URL

代码片段
def batch_summarize(urls: list[str]) -> dict[str, str]:
    """批量处理多个新闻URL"""
    results = {}

    for url in urls:
        print(f"正在处理: {url}")
        summary = summarize_news(url)
        results[url] = summary

    return results

# Usage example:
# urls = ["https://example.com/news1", "https://example.com/news2"]
# summaries = batch_summarize(urls)

B. HTML缓存机制(避免重复下载)

代码片段
import hashlib 
from pathlib import Path 

CACHE_DIR = Path("news_cache")

def get_cached_content(url: str) -> tuple[str, str] | None:
    """检查是否有缓存内容"""
    if not CACHE_DIR.exists():
        CACHE_DIR.mkdir()

    url_hash = hashlib.md5(url.encode()).hexdigest()
    cache_file = CACHE_DIR / f"{url_hash}.txt"

    if cache_file.exists():
        with open(cache_file, "r", encoding="utf-8") as f:
            title, content = f.read().split("\n", maxsplit=1)
            return title.strip(), content.strip()

    return None

def cache_content(url: str, title: str, content: str):
    """缓存已下载的内容"""
    url_hash = hashlib.md5(url.encode()).hexdigest()

    with open(CACHE_DIR / f"{url_hash}.txt", "w", encoding="utf-8") as f:
        f.write(f"{title}\n{content}")

修改后的extract_news_content:

“`python{4-6}
def extractnewscontent(url: str) -> tuple:
“””从URL提取新闻标题和正文内容”””
先检查缓存
如果有则返回缓存内容

代码片段
无缓存则继续原流程...
获取到新内容后调用cache_content保存到本地

返回结果...
代码片段

## API调用优化建议

1. **速率限制**:OpenAI API有每分钟请求限制,批量处理时建议添加延迟:
   ```python 
   import time 
   time.sleep(1) # requests per second 
  
  1. 错误重试:网络请求可能失败,添加重试逻辑:
    代码片段
    from tenacity import retry, stop_after_attempt 
    
    @retry(stop=stop_after_attempt(3))
    def call_api_with_retry(messages):
        return llm(messages) <br>
    

完整示例代码

代码片段
import os 
import time 
from pathlib import Path 
from dotenv import load_dotenv 
from newspaper import Article 
from langchain.chat_models import ChatOpenAI 
from langchain.prompts import ChatPromptTemplate 

# [之前定义的所有函数和常量...]

if __name__ == "__main__":
    加载环境变量...

    示例用法1:单条URL处理  
    示例用法2:从文件读取多个URL批量处理  

    可选:将结果保存到Markdown文件方便查看  

部署建议

  1. 本地运行:直接执行脚本即可
  2. Web服务化:使用FastAPI包装成REST接口

    代码片段
    pip install fastapi uvicorn  
    
  3. 定时任务:结合cron或APScheduler实现每日自动摘要

FAQ常见问题解决

Q1: newspaper无法解析某些网站
A1:
– Try调整User-Agent
– Consider换用beautifulsoup4+requests手动解析

Q2: API返回速率限制错误
A2:
– Implement指数退避重试机制
– Upgrade账户等级或联系OpenAI

Q3: Summary质量不高怎么办?
A3:
– Fine-tune提示词模板增加具体要求示例
– Switch到更强大的模型如gpt-4


通过本教程,你已经掌握了使用Python+LangChain构建自动化新闻摘要工具的核心方法。这个基础框架可以进一步扩展为浏览器插件、邮件订阅服务等实用工具。

原创 高质量