GitHub周趋势2026W25 | Headroom 压缩 95% Token、NVIDIA 开源 AI Agent 安全扫描器、…
2026-07-28
2026-08-03 0
我之前做的 AI Agent 跑生产 6 个月,现在把完整搭建过程复盘一遍。

从环境到部署,5 步搭起来一个能问实时问题的 AI Agent。
| 组件 | 选择 | 理由 |
|---|---|---|
| LLM | gpt-4o / claude-sonnet-4-5 | 综合能力 |
| SERP API | serpbase | 价格低 + 数据完整 + AI 集成好 |
| 后端 | Python FastAPI | 异步支持好 |
| 前端 | Gradio | 快速 demo |
| 部署 | Docker + Vercel | 简单 |
成本结构:gpt-4o 输入 0.30/1k = 一次问答 $0.012。
去 serpbase.dev 注册,送 100 次免费调用,不用绑卡。
拿 API key 后存环境变量:
复制代码export SERPBASE_API_KEY=your-keyexport OPENAI_API_KEY=sk-...完整代码 80 行:
复制代码import osimport requestsfrom openai import OpenAIclass SearchAgent:def __init__(self): self.serp_key = os.environ['SERPBASE_API_KEY'] self.openai = OpenAI() def search(self, query: str) -> dict: r = requests.post( 'https://api.serpbase.dev/google/search', headers={'X-API-Key': self.serp_key}, json={'q': query, 'hl': 'zh-CN', 'gl': 'cn', 'num': 10}, timeout=(2, 5) ) r.raise_for_status() return r.json()def format_context(self, serp: dict) -> str: lines = ['## 搜索结果']for i, item inenumerate(serp.get('organic', [])[:5], 1): lines.append(f"[{i}] {item['title']}n{item['snippet'][:80]}n来源: {item['link']}")return 'n'.join(lines)def ask(self, question: str) -> str: serp = self.search(question) if not serp.get('organic'):return "暂未找到相关信息" context = self.format_context(serp) prompt = f"""基于以下搜索结果回答问题,只引用事实。{context}问题: {question}""" r = self.openai.chat.completions.create( model='gpt-4o', messages=[{'role': 'user', 'content': prompt}], temperature=0, timeout=15 ) return r.choices[0].message.contentif __name__ == '__main__': agent = SearchAgent() print(agent.ask('2026 年 Q2 上海 GDP'))10 行加 UI:
复制代码import gradio as grdef chat(question):return SearchAgent().ask(question)demo = gr.Interface( fn=chat, inputs=gr.Textbox(label="问题"), outputs=gr.Textbox(label="答案"), title="实时搜索 AI Agent")demo.launch()跑起来:python app.py,浏览器开 。
直接跑会发现 3 个常见错误,加上去:
复制代码def search(self, query):try: r = requests.post(..., timeout=(2, 5)) r.raise_for_status() return r.json()except requests.Timeout:# 降级 1: stale cache cached = get_stale_cache(query) return cached or {'organic': []}except requests.HTTPError as e:if e.response.status_code == 429:# 降级 2: 等待 Retry-After time.sleep(int(e.response.headers.get('Retry-After', 1)))return self.search(query) # 重试 1 次raisedef ask(self, question): serp = self.search(question) if not serp.get('organic'):return "暂未找到相关信息,你可以:n1. 加时间词(如 '2026')n2. 加地域词n3. 换个说法"# ... LLM 调用Docker 化:
复制代码FROM python:3.11-slimWORKDIR /appCOPY requirements.txt .RUN pip install -r requirements.txtCOPY . .CMD ["python", "app.py"]部署到 Vercel / Railway / 自己的 VPS。
跑起来后,几个常见优化:
缓存。同 query 5 分钟内复用:
复制代码import redisr = redis.Redis()def cached_search(query): key = hashlib.md5(query.encode()).hexdigest() cached = r.get(key) if cached:return json.loads(cached) data = search(query) r.setex(key, 300, json.dumps(data))return data并发。多用户同时问,用 asyncio:
复制代码async defask_async(question): serp = await search_async(question)return await llm_async(question, serp)token 压缩。SERP JSON 太大,只取前 5 条 + 截 snippet 80 字符。
写几个测试 query 验证:
复制代码test_queries = [ ('2026 年 Q2 上海 GDP', '2026'), ('BTC 实时价格', 'BTC'), ('今日新闻头条', None), # 模糊 query]for q, expected in test_queries: answer = agent.ask(q) print(f"Q: {q}nA: {answer}n")跑生产后,盯 3 个指标:
复制代码from prometheus_client import Counter, Histogramrequests_total = Counter('agent_requests_total', 'Total requests')latency = Histogram('agent_latency_seconds', 'Latency')@latency.time()def ask(question): requests_total.inc() return agent.ask(question)Grafana 看板,3 个面板:请求量 / 延迟 / 错误率。
跑下来:
整套从 0 到生产,1 个工程师 1 天搭完。
跑起来后,可以扩展:
我下一步上 ReAct 多轮搜索,预计准确率能到 94%。
完整代码 + 部署文档放 GitHub,clone 就能跑。serpbase 注册后 5 分钟接好,1 小时搭完整个 Agent。