[ blog · use-case ]8 min read

สร้าง Agent สรุปข่าวเช้าด้วย News Search API

Sarah Choyเผยแพร่ 2 พฤษภาคม 2569อ่าน 8 นาที
สร้าง Agent สรุปข่าวเช้าด้วย News Search API

ทุกผู้ก่อตั้ง PM และนักวิเคราะห์ต้องการสิ่งเดียวกันตอน 8 โมงเช้า นั่นคือสรุปที่กระชับว่าอะไรเปลี่ยนไปเมื่อคืน ด้วย News Search API, LLM และแพลตฟอร์มที่รัน HTTP-cron ได้ คุณสร้างมันเสร็จได้ในบ่ายเดียว

สรุปสั้น

  • สถาปัตยกรรม: cron → News Search → URL Extract สำหรับข่าวที่น่าสนใจ → สรุปด้วย LLM → โพสต์ลง Slack/อีเมล
  • ปรับความสดของข่าวด้วย <code>start_date</code> = วันนี้ − 1; ปรับ locale ด้วย <code>country_code</code>
  • แบ่งสรุปข่าวตามหัวข้อด้วยการ query News Search แบบขนาน แล้วให้ LLM รวมและตัดข่าวซ้ำ
  • ต้นทุนรวมราว 15 เครดิตต่อหัวข้อต่อวัน บวกกับ token ของ LLM สรุปข่าว 5 หัวข้อคิดเป็น &lt; $0.10/วัน ที่ราคาปกติ

รูปร่างของสรุปข่าวที่มีประโยชน์

agent สรุปข่าวเช้าควรตอบคำถามเดียว: \"อะไรเปลี่ยนไปเมื่อคืนที่ฉันจำเป็นต้องรู้?\" มาตรฐานนี้ยากกว่าที่คิด การเทพาดหัวมากองรวมกันคือความล้มเหลว — มันไม่ต่างจาก RSS และจะถูกปิดเสียงภายในหนึ่งสัปดาห์ ผลลัพธ์ที่อยู่รอดคือสรุปข่าว 5 หัวข้อพร้อมลิงก์ จัดตามหัวข้อ ในน้ำเสียงของผู้ใช้เอง

สิ่งนี้แตกออกเป็น pipeline เล็ก ๆ ได้ดังนี้:

  • ดึง ข่าวล่าสุดข้าม N หัวข้อ — News Search API
  • สกัด เนื้อหาของลิงก์ใดก็ตามที่โมเดลอยากอ้างอิง — URL Extract API
  • สรุป + จัดกลุ่ม ด้วย LLM — โมเดลที่คุณเลือกเอง
  • โพสต์ ลง Slack / อีเมล / Notion — ช่องทางสื่อสารเดิมของคุณ
  • ตั้งเวลา ด้วย cron — Vercel Cron, GitHub Actions, n8n ฯลฯ

ขั้นที่ 1: เลือกหัวข้อของคุณ

จำกัดไว้ที่ 3–6 หัวข้อ สรุปข่าวที่มี 12 หัวข้อจะถูกเลื่อนผ่าน ตัวอย่างเช่น:

  • สำหรับผู้ก่อตั้ง B2B SaaS: \"รอบระดมทุนด้าน AI\", \"ข่าว OpenAI / Anthropic\", \"ความเคลื่อนไหวของคู่แข่ง\"
  • สำหรับนักวิเคราะห์การเงิน: \"FOMC และ Treasury\", \"ห่วงโซ่อุปทานเซมิคอนดักเตอร์\", \"หุ้นเฉพาะตัว\"
  • สำหรับ PM ด้านสุขภาพ: \"การอนุมัติของ FDA\", \"ผลการทดลองทางคลินิก\", \"การเปลี่ยนแปลงการเบิกจ่าย\"

ขั้นที่ 2: ดึงสัญญาณดิบ

รัน News Search หนึ่งครั้งต่อหนึ่งหัวข้อแบบขนาน ใช้ start_date เพื่อจำกัดความสดของข่าว:

from datetime import date, timedelta
import asyncio, aiohttp

KEY = "pk_yourkey"
TOPICS = [
    "AI agent infrastructure funding",
    "OpenAI Anthropic Google new releases",
    "RAG and LLM tool calling research",
]

async def fetch_topic(session, q):
    yesterday = (date.today() - timedelta(days=1)).isoformat()
    async with session.post(
        "https://www.apipick.com/api/search/news",
        headers={"x-api-key": KEY},
        json={"query": q, "start_date": yesterday},
    ) as r:
        return q, await r.json()

async def fetch_all():
    async with aiohttp.ClientSession() as s:
        return await asyncio.gather(*[fetch_topic(s, q) for q in TOPICS])

แต่ละครั้งจะคืนพาดหัวที่จัดอันดับแล้วสูงสุด 5 รายการ (สูงสุด 10 ด้วย num_results) สำหรับสรุปข่าว 3 หัวข้อคิดเป็น 3 × 15 = 45 เครดิตต่อรอบ ที่อัตรา $5 / 5,000 เครดิต เท่ากับ $0.045/วัน ต้นทุนรายวันถูกครอบงำโดย LLM ไม่ใช่ news API

ขั้นที่ 3: สกัดเนื้อหาแบบเลือกสรร

คุณไม่จำเป็นต้องมีเนื้อหาเต็มของทุกข่าว — เอาแค่ข่าวที่โมเดลอยากอ้างอิงอย่างละเอียดก็พอ วิธีคิดง่าย ๆ คือ สกัดข่าว 2 อันดับแรกต่อหัวข้อ กับ API Pick นั่นเป็นการเรียกแบบ batch เพียงครั้งเดียว:

import requests

urls = [r["url"] for topic, payload in results for r in payload["results"][:2]]

extracted = requests.post(
    "https://www.apipick.com/api/extract",
    headers={"x-api-key": KEY},
    json={"urls": urls, "extract_effort": "auto"},
).json()

ที่ 2 เครดิตต่อ URL ขั้นตอนสกัดเนื้อหาเพิ่มขึ้นราว 12 เครดิต/วัน สำหรับสรุปข่าว 3 หัวข้อ

ขั้นที่ 4: prompt สำหรับสรุป

prompt คือที่ที่น้ำเสียงของสรุปข่าวอาศัยอยู่ ตัวอย่างเริ่มต้น:

You are an assistant that writes a morning briefing in <Sarah's> voice:
direct, no fluff, no marketing language.

Input: a JSON list of {topic, headlines, extracted_bodies}.

Output rules:
- 1 short paragraph per topic, max 60 words.
- Each paragraph ends with up to 3 inline source links.
- If a topic has fewer than 2 substantive stories overnight, omit it.
- If the entire briefing has fewer than 2 substantive topics, output the
  literal token SKIP and nothing else.
- Never editorialise. Quote facts and figures verbatim from the sources.

Output format: Slack-flavoured markdown.

คำสั่ง \"SKIP ถ้าสัญญาณต่ำ\" คือกฎที่ให้ผลตอบแทนสูงสุดเพียงข้อเดียว มันคือเหตุผลที่สรุปข่าวของคุณจะไม่ถูกปิดเสียง

ขั้นที่ 5: โพสต์และตั้งเวลา

สำหรับ cron แบบ Python สคริปต์ทั้งหมดยาว < 80 บรรทัด การโพสต์ลง Slack:

if briefing.strip() == "SKIP":
    return
requests.post(
    SLACK_WEBHOOK_URL,
    json={"text": briefing, "username": "Morning Briefing", "icon_emoji": ":sunrise:"},
)

ตั้งเวลาด้วย Vercel Cron (ใน vercel.json), GitHub Actions, AWS EventBridge หรือ n8n รันตอน 7:45 น. ตามเขตเวลาของคุณ — เป้าหมายคือให้มันรออยู่แล้วเมื่อคุณนั่งลงตอน 8 โมง

ทำใน n8n ถ้าคุณชอบแบบไม่เขียนโค้ด

  • Schedule trigger — รายวัน 7:45 น. ตามเขตเวลาผู้ใช้
  • โหนด HTTP Request (หนึ่งโหนดต่อหนึ่งหัวข้อ) POST /api/search/news พร้อม start_date ของเมื่อวาน
  • โหนด Merge รวมผลลัพธ์ของแต่ละหัวข้อเข้าด้วยกัน
  • โหนด HTTP Request เรียก /api/extract ด้วย URL อันดับต้น ๆ
  • โหนด OpenAI / Anthropic รัน prompt สำหรับสรุป
  • โหนด If ตรวจว่าผลลัพธ์ไม่ใช่ SKIP
  • โหนด Slack โพสต์สรุปข่าว

สิ่งที่ต้องระวังตอนขึ้น production

  • หัวข้อเลื่อนไหล \"AI agents\" กว้างเกินไปหลังผ่านไป 6 เดือน — ดัชนีของ API เติบโตขึ้น แต่สรุปข่าวของคุณต้องยังคงเจาะจง ปรับ query ให้แคบลงทุกไตรมาส
  • ความซ้ำข้ามวัน ส่ง URL ของวันก่อนให้โมเดลพร้อมคำสั่ง \"don't re-cover stories from this list\" ถ้าข่าวเดิมโผล่ซ้ำ ๆ
  • วันหยุดสุดสัปดาห์ที่เงียบเหงา กฎ SKIP จัดการเรื่องนี้ให้แล้ว เพียงอย่าผูกนิสัยเช็กข่าวประจำวันของคุณไว้กับสรุปข่าว

ทำซ้ำและปรับปรุง อย่าปล่อยทิ้งหลังปล่อยของ

อ่านสรุปข่าวทุกเช้าเป็นเวลาหนึ่งสัปดาห์ จดว่าโมเดลโกหกตรงไหน จัดหมวดผิด หรือพลาดอะไรไป แล้วอัปเดต prompt หลังผ่านการปรับปรุงไปหนึ่งสัปดาห์ สรุปข่าวจะกลายเป็นนิสัย — และคุณก็ได้สร้าง agent ที่ใช้งานได้จริงด้วยโค้ดราว 80 บรรทัดกับการเรียก API สามครั้ง

คำถามที่พบบ่อย

ทำไมไม่ใช้แค่ Google News หรือตัวรวม RSS ไปเลย?

ทั้งสองใช้ได้ — แต่ทั้งสองก็ทิ้งงานน่าเบื่อไว้ให้คุณทำเอง ทั้งการจัดกลุ่ม ตัดข่าวซ้ำ สรุป และเขียนสรุปข่าวจริง ๆ agent ทำส่วนนั้นให้ด้วย LLM ส่วน RSS ให้แค่พาดหัว แต่ agent ให้ย่อหน้าที่บอกว่าอะไรสำคัญพร้อมลิงก์ไปยังแหล่งข่าว

News Search API สดแค่ไหน?

API ทำดัชนีสำนักข่าวใหญ่แบบเกือบเรียลไทม์ สำหรับสรุปข่าวตอน 8 โมงที่ครอบคลุม 24 ชั่วโมงก่อนหน้า ให้ตั้ง start_date เป็นเมื่อวาน สำหรับบอทข่าวด่วนที่รันทุกชั่วโมง ให้ตั้ง start_date เป็นวันนี้ แล้วรัน agent ซ้ำโดยตัดข่าวซ้ำเทียบกับรอบล่าสุด

ถ้าสรุปข่าวไม่มีอะไรใหม่จะเกิดอะไรขึ้น?

ใส่เงื่อนไขนี้ลงใน prompt เลย: 'If fewer than 3 substantive stories changed overnight, return SKIP.' cron job ของคุณควรเคารพ SKIP และไม่โพสต์สรุปข่าวที่สัญญาณต่ำ ความเบื่อจากสรุปข่าวคือทางลัดที่เร็วที่สุดในการทำให้ช่อง Slack ถูกปิดเสียง

รันโดยไม่ใช้ n8n ได้ไหม?

ได้ ขั้นตอนเดียวกันรันเป็นสคริปต์ Python ยาว 30 บรรทัดบน cron ได้ — ดูตัวอย่างด้านล่าง n8n สะดวกสำหรับการดีบักแบบเห็นภาพและการเชื่อมกับ Slack แต่ไม่จำเป็นต้องใช้

จะป้องกันไม่ให้ข่าวเดียวกันถูกสรุปข้ามหลายหัวข้อได้อย่างไร?

ส่ง URL จาก query ก่อนหน้าในรอบเดียวกันให้โมเดลพร้อมคำสั่ง: 'do not re-mention any URL already covered.' หรือรันการค้นหาแบบหลายหัวข้อครั้งเดียวแล้วปล่อยให้โมเดลจัดแบ่งเอง ทั้งสองวิธีใช้ได้ วิธีหลังถูกกว่า

API ที่ใช้ในบทความนี้

Sarah Choy
เขียนโดย
Sarah Choy
CEO, API Pick

Sarah Choy เป็น CEO ของ API Pick เธอเขียนเกี่ยวกับการสร้าง API พร้อมใช้งานจริงสำหรับ AI agent และเวิร์กโฟลว์ LLM