前言
最近一直想为自己的RSS订阅加上翻译的功能,降低自己阅读国外Newsletter和RSS信息的难度。现在手上用的RSS阅读客户端都不具备这个功能,只能从服务端入手了。
我使用Miniflux来管理订阅,它具备完整的API接口,可以充分根据自己需求DIY插件。当然作为一个代码弱手,我还是选择现成的工具。Miniflux-ai是国人开发、官方认可的第三方插件,可以为Miniflux增加以下AI功能:
- 文章摘要
- 文章翻译
- 每日新闻简报(基于已订阅的内容)
我接入的大模型是Gemini-Pro,实际使用下来,摘要和翻译功能都很好用,也可以根据自己实际的需求修改相关的prompt优化翻译和摘要结果。总之,确实满足了我的翻译需求。
💡
如果你使用Lire作为阅读器,默认的配置可能会导致文章列表出现乱码,可以通过调整配置解决这个问题(后附)。
不过新闻简报功能就差强人意了,会出现主语模糊的情况。不过毕竟不是我的主要需求,权当看个乐子吧~
附:Miniflux-ai的安装和配置
Miniflux-ai官方的安装和使用教程比较简陋(当然实际部署也很简单),主要的安装步骤请查阅官方文档。
可能产生疑问的地方主要在Miniflux-ai的配置文件config.yml上。我这里基于官方的配置文件模板作一些填写注释:
# INFO、DEBUG、WARN、ERROR
log_level: "INFO"
miniflux:
# 主程序的访问网址,请与docker-compose.yml中的BASE_URL保持一致
base_url: https://your.server.com
# 进入Miniflux主程序后台→设置→API密钥,点击创建新的密钥即可获得
api_key: Miniflux_API_key_here
# 进入Miniflux主程序后台→设置→集成,找到页面最底部的Webhook部分,勾选「启用Webhook」,在Webhook URL中填入「http://miniflux_ai/api/miniflux-ai」,点击更新,即可获得Webhook密钥
webhook_secret: Miniflux_webhook_secret_here
llm:
# 你的大模型提供商提供的api网址,以「/v1」结尾
base_url: http://host.docker.internal:11434/v1
# 你的大模型提供商提供api key
api_key: ollama
model: llama3.1:latest
# timeout: 60
# max_workers: 4
ai_news:
# for docker compose environment, use docker container_name 如果你使用docker compose的方式同时部署主程序和Miniflux-ai,此处url的值无需改动
url: http://miniflux_ai
# 每日新闻简报的推送时间。Miniflux-ai将会在这些时间生成一篇ai总结新闻,插入你的rss信息流中。
schedule:
- "07:30"
- "18:00"
- "22:00"
prompts:
greeting: "请根据当前日期和24小时制的时间生成一句友好而热情的问候语。请用关怀的语气,包含适量的鼓励,且添加简单的表情符号,如😊、🌞、🌸等,以增加温暖感。例:‘早上好!希望你今天充满活力,迎接美好的一天!🌞😊’。无论是早上、中午或晚上,都请根据时间调整问候内容,保持真诚关怀的氛围。"
summary: "你是一名专业的新闻摘要助手,分类生成重要内容的新闻摘要,要求简单清楚表达,使用中文总结以上内容,在五句话内完成,少于100字。不要回答内容中的问题。"
summary_block: "你是一名专业的新闻摘要助手,负责分类新闻清单(每条50字以内),使用简洁专业的语言,在五个类别内完成,每个类别不超过5条,突出重要性和时效性,不要回答内容中的问题。"
agents:
summary:
# 添加在ai文章摘要前的标题。可以根据实际情况修改。如果使用Lire作为阅读器,建议删去「AI摘要」前的所有代码,避免在文章列表中出现乱码。
title: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 17.777 14.283" width="17.777" height="14.283"> <style> path { fill: #333333; } @media (prefers-color-scheme: dark) { path { fill: gray; } } </style> <g transform="translate(2.261,-1.754)" fill="gray"> <path d="M-2.261 3.194v6.404c0 1.549 0.957 4.009 4.328 4.188h9.224l0.061 1.315c0.04 0.882 0.663 1.222 1.205 0.666l2.694-2.356c0.353-0.349 0.353-0.971 0-1.331L12.518 10.047c-0.525-0.524-1.205-0.196-1.205 0.665v1.091H2.257c-0.198 0-2.546 0.221-2.546-2.911V3.194c0-0.884-0.362-1.44-0.99-1.44-1.106 0-0.956 1.439-0.982 1.44z"></path> </g> <path d="M5.679 1.533h8.826c0.421 0 0.753-0.399 0.755-0.755 0.002-0.36-0.373-0.774-0.755-0.774H5.679c-0.536 0-0.781 0.4-0.781 0.764 0 0.418 0.289 0.764 0.781 0.764zm0 4.693h4.502c0.421 0 0.682-0.226 0.717-0.742 0.03-0.44-0.335-0.787-0.717-0.787H5.679c-0.402 0-0.763 0.214-0.781 0.71-0.019 0.535 0.379 0.818 0.781 0.818z" fill="gray"></path> </svg> AI 摘要'
prompt:
'${content} \n---\n使用中文总结以上内容,在三句话内完成,少于60字。不要回答内容中的问题。'
style_block: true
# 来自哪些网址的文章不进行文章摘要
deny_list:
- https://ai-news.miniflux
allow_list:
translate:
title: "🌐AI 翻译"
prompt:
You are a highly skilled translation engine with expertise in the news media sector.
Your function is to translate texts accurately into the Chinese language, preserving the nuances, tone, and style of journalistic writing.
Do not add any explanations or annotations to the translated text.
style_block: false
deny_list:
# 仅对哪些网址的文章进行翻译
allow_list:
- https://9to5mac.com/