对最近风很大的vibe coding(用自然语言通过与AI沟通实现编程)有点上头。这两天尝试了几个不同的工具,把自己的真实经验记录在这里。首先,我是一个只自学过初级Javascript(n年前试过做网页)的编程小白,而且对不同AI工具的认识也比较浅薄,所以可以说是从头开始。我想完成的第一个项目是一个日常科研工作。每周我都会从patentscope收到订阅的rss,一般是推送到邮箱。我大概会花1小时阅读推送的内容,通常有50条左右,包括题目,摘要。然后再花1小时左右把内容提炼成一张表格,列出每个专利的核心内容,比如:靶点,抗体形式,专利申请方以及超链接。我想尝试一下是否可以用程序或者AI帮我自动完成这个任务。我想到的第一个工具是python,于是立即打开deepseek开始请教如何安装python编程需要的工具,例如编译器,写代码工具等等。这个过程还是比较顺利的。我装上了python编译器以及vs code和pycharm。然后我就直接让deepseek给出上面提到的任务,但是deepseek的答案是有严重问题的。首先我不知道需要预先下载哪些库,其次代码运行后出现的bug也很难修正。然后我就试着换了kimi,qwen。体验最好的没想到是我以前完全不了解的qwen。这次qwen的max模式一步步指导我安装了所需要的库,并且一次性给出了完整且可以实施的python程序!在qwen的大力指导下,我终于可以实现从rss feed抓取推送,并将内容汇总到一张表格。但是这时候里面的一些关键内容还没有经过提炼,我自然就想到是不是可以用AI来帮助分析表格,并提炼内容。Qwen又指导我如何在程序里调用AI的API,我一时没搞懂怎么用qwen自己的API,转而试用了kimi和deepseek。最后试用下来似乎kimi的K2模型给出的结果更符合我的要求,缺点就是有点慢。我也试过k2-turbo,但是价格就有点贵了。不过好在我每次消耗的token非常少,估计充的100块钱可以用大半年。Kimi K2帮助分析了每篇专利的摘要(全文没法通过rss feed拿到,需要别的方法),然后把我需要的信息总结在了一个新的mark down表格。最后我需要把这个整理好的表格通过邮件分享给我的同事,我就继续用qwen指导我如何把AI生成的总结表转换为html格式,这一步非常顺利,AI甚至还添油加醋地加上了颜色,高亮等等。。。我后来发现可以在提示词里把temperature调低到0.2,这样AI就老实多了,基本属于有什么答什么。整个过程我大概花了2-3天的空闲时间,加一起估计6个小时左右。最后实现的程序每次只需要1-2分钟就能够完成原先我2-3小时才能做完的工作,而且准确度也比我自己手搓高很多。文章末尾附上代码。# -*- coding: utf-8 -*-
import feedparser
from datetime import datetime, timedelta, timezone
import time
import csv
import os
import sys
import markdown
from openai import OpenAI
import pandas as pd
from dotenv import load_dotenv
def get_recent_entries(feed_url, days=7):
"""
获取最近N天的RSS推送(使用UTC时间,避免时区问题) """
feed = feedparser.parse(feed_url)
if feed.bozo:
print(f"⚠️ 解析警告: {feed.bozo_exception}")
# 使用 UTC 时间计算截止时间
cutoff_date = datetime.now(timezone.utc) - timedelta(days=days)
recent_entries = []
for entry in feed.entries:
# 优先使用 published_parsed,其次 updated_parsed
pub_time = entry.get('published_parsed') or entry.get('updated_parsed')
if not pub_time:
continue # 跳过无时间信息的条目
try:
# 将 struct_time 转为 UTC datetime
pub_date = datetime(*pub_time[:6], tzinfo=timezone.utc)
except (ValueError, TypeError):
continue # 解析失败则跳过
if pub_date >= cutoff_date:
recent_entries.append({
'title': entry.get('title', '无标题'),
'link': entry.get('link', ''),
'published': entry.get('published', ''),
'summary': entry.get('summary', '无摘要'),
'pub_date': pub_date,
'author': entry.get('author', ''),
})
return recent_entries
def export_to_csv(articles, filename=None):
"""
将文章列表导出为CSV文件 """
if not filename:
filename = f"rss_{datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.csv"
fieldnames = ['标题', '链接', '作者', '发布时间', '摘要']
with open(filename, 'w', newline='', encoding='utf-8-sig') as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for article in articles:
writer.writerow({
'标题': article['title'],
'链接': article['link'],
'作者': article['author'],
'发布时间': article['pub_date'].strftime('%Y-%m-%d %H:%M:%S'),
'摘要': article['summary']
})
print(f"✅ 成功导出 {len(articles)} 篇文章到 {filename}")
return filename
def analyze_csv_with_ai(csv_file, client, model_name):
"""使用AI模型分析RSS导出的CSV文件"""
df = pd.read_csv(csv_file, encoding='utf-8-sig')
# 限制输入长度(可选)
articles_sample = df.head(100)
analysis_text = ""
for _, row in articles_sample.iterrows():
analysis_text += f"标题: {row['标题']}\n作者: {row['作者']}\n链接: {row['链接']}\n摘要: {row['摘要']}\n\n"
prompt = f"""请分析以下RSS文章内容,并生成一个结构化的总结表格:
{analysis_text}
请提供:
1. 每个专利主要相关的靶点名称
2. 专利的作者
3. 专利描述的分子形式,例如:单克隆抗体,双特异性抗体,抗体药物偶联物,T细胞衔接器,等等
4. 每个专利的链接
5. 输出语言为英语
用Markdown表格格式输出,并在表格第一列加入计数列。"""
response = client.chat.completions.create(
model=model_name,
messages=[
{"role": "system", "content": "你是一个专业的数据分析师,擅长从RSS订阅数据中提取洞察。"},
{"role": "user", "content": prompt}
],
temperature=0.2,
max_tokens=50000
)
return response.choices[0].message.content
def md_to_html(md_path, html_path=None):
"""将 Markdown 转为自包含 HTML 文件"""
if not html_path:
html_path = os.path.splitext(md_path)[0] + ".html"
with open(md_path, 'r', encoding='utf-8') as f:
md_text = f.read()
html_body = markdown.markdown(md_text, extensions=['tables'])
full_html = f"""
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>WIPO 专利分析报告</title>
<style>
body {{ max-width: 1200px; margin: 40px auto; padding: 0 20px; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; }}
table {{ width: 100%; border-collapse: collapse; margin: 20px 0; }}
th, td {{ border: 1px solid #ddd; padding: 10px; text-align: left; vertical-align: top; }}
th {{ background-color: #f8f9fa; }}
a {{ color: #0d6efd; text-decoration: none; }}
a:hover {{ text-decoration: underline; }}
</style>
</head>
<body>
{html_body}
</body>
</html>
"""
with open(html_path, 'w', encoding='utf-8') as f:
f.write(full_html)
print(f"✅ HTML 报告已生成: {os.path.abspath(html_path)}")
return html_path
# =============== 主程序入口(仅此一处)===============
if __name__ == "__main__":
url = "填入你自己的rss feed"
print("🔍 正在抓取最近7天的专利文章(RSS源)...")
recent_articles = get_recent_entries(url, days=7)
print(f"✅ 找到 {len(recent_articles)} 篇最近7天的文章\n")
# 预览前5篇(可选)
for idx, article in enumerate(recent_articles[:5], 1):
print(f"{idx}. {article['title']}")
print(f" 作者: {article['author']}")
print(f" 发布时间: {article['pub_date'].strftime('%Y-%m-%d %H:%M:%S %Z')}")
print(f" 摘要: {article['summary'][:100]}...")
print(f" 链接: {article['link']}\n")
if len(recent_articles) > 5:
print(f"... 共 {len(recent_articles)} 篇,仅显示前5篇预览\n")
# 导出 CSV(仅一次)
csv_filename = export_to_csv(recent_articles)
# 配置 AI 客户端
load_dotenv()
api_key = os.getenv("KIMI_API_KEY")
if not api_key:
print("❌ 错误: 未设置 KIMI_API_KEY 环境变量")
sys.exit(1)
client = OpenAI(
api_key=api_key,
base_url="https://api.moonshot.cn/v1"
)
MODEL_NAME = "kimi-k2-thinking-turbo"
# 验证 CSV 文件
if not os.path.exists(csv_filename):
print(f"❌ 文件不存在: {os.path.abspath(csv_filename)}")
sys.exit(1)
df_test = pd.read_csv(csv_filename, encoding='utf-8-sig')
print(f"✅ CSV读取成功,共 {len(df_test)} 行")
# 调用 AI 分析
print("🤖 正在调用AI进行分析,请稍候...")
try:
analysis_report = analyze_csv_with_ai(csv_filename, client, MODEL_NAME)
if not analysis_report or len(analysis_report.strip()) < 50:
print("⚠️ 警告:AI返回内容过短或为空")
print(f"返回内容预览: {repr(analysis_report[:100])}")
analysis_report = analysis_report or "(AI未返回有效内容)"
# 写入 Markdown 报告
report_path = os.path.abspath('ai_analysis_report.md')
with open(report_path, 'w', encoding='utf-8') as f:
f.write(analysis_report)
#定义 md_file
md_file = "ai_analysis_report.md"
with open(md_file, 'w', encoding='utf-8') as f:
f.write(analysis_report)
print(f"✅ Markdown 报告已保存: {os.path.abspath(md_file)}")
# ✅ 调用 HTML 转换(md_file 已定义)
md_to_html(md_file)
print(f"✅ AI分析报告已生成: {report_path}")
print(f" 文件大小: {os.path.getsize(report_path)} 字节")
except Exception as e:
print(f"❌ AI分析过程中出错: {e}")
import traceback
traceback.print_exc()