Web开发者快速上手AI Agent:基于提示工程的旅游攻略系统实战

图片来源网络,侵权联系删。

文章目录

引言:从Web需求优化到AI提示词优化

作为Web开发者,我们早已习惯于"需求澄清"------产品经理说"做个好看的页面",我们要追问:好看是指配色?动效?还是响应式?这种不断细化模糊需求的过程,其实与AI领域的**提示词优化(Prompt Engineering)**高度相似。

在AI应用开发中,模型就像一个能力强大但理解力有限的"外包程序员"------你给它一句模糊指令:"帮我生成一份旅游攻略",它可能输出千篇一律的景点列表;但如果你像对待前端组件一样结构化地描述需求:"用户是情侣,预算5000元,偏好小众文艺目的地,行程3天2晚,需包含交通、住宿、美食和拍照点",模型就能输出精准、个性化的结果。

本文将带你用熟悉的Web技术栈(Node.js + React),构建一个基于Agent提示工程的智能旅游攻略系统,实现从"模糊请求"到"结构化输出"的端到端流程,助你平滑转型AI应用开发。


Web开发与AI Agent应用的天然衔接点

很多Web开发者误以为AI开发必须重学Python、深度学习框架,其实不然。现代AI Agent(如LangChain、LlamaIndex等)已提供完善的REST API 或 JavaScript SDK,其集成逻辑与调用第三方支付、地图API无异:

Web开发场景 AI Agent类比
调用高德地图API获取POI 调用Agent API生成行程建议
JWT认证保护后端接口 API Key认证调用大模型服务
前端状态管理(Redux) Agent上下文(Context)管理
组件模板(React) 提示词模板(Prompt Template)
服务部署(Docker/Nginx) Agent服务资源隔离与限流

因此,Web开发者只需掌握提示工程的核心方法论,即可快速构建AI原生应用。


Agent提示词优化的核心原理(Web视角解读)

1. 提示词 = 前端组件的Props

在React中,我们通过props向组件传递数据:

jsx 复制代码
<TripPlanner 
  travelers="情侣" 
  budget={5000} 
  days={3}
  style="小众文艺"
/>

同理,在提示工程中,我们将用户输入结构化为变量,注入预定义的提示模板:

text 复制代码
你是一位资深旅行规划师,请为{{travelers}}设计一份{{days}}天{{nights}}晚的{{style}}风格旅游攻略。
总预算不超过{{budget}}元,需包含:
- 每日详细行程(含交通方式)
- 推荐住宿(名称+价格区间)
- 必吃美食(店名+人均)
- 适合拍照的打卡点
请以Markdown格式输出,不要使用任何XML标签。

这种**模板化提示(Prompt Template)**极大提升了输出稳定性,避免模型"自由发挥"。

2. Agent的"思维链" = 后端业务逻辑流程

传统Web后端处理订单可能分步:校验库存 → 计算价格 → 生成订单号 → 发通知。

Agent的**思维链(Chain-of-Thought)**也是多步推理:

  1. 意图识别:用户要的是亲子游还是蜜月游?
  2. 参数提取:从自然语言中抽取出预算、天数、偏好等字段
  3. 工具调用:查询天气API、酒店价格数据库
  4. 内容生成:基于结构化数据生成攻略
  5. 格式化输出:转为Markdown或JSON

这完全可映射为Web中的微服务编排


实战:构建旅游攻略系统(Node.js + React)

项目结构

bash 复制代码
travel-agent/
├── backend/               # Node.js后端
│   ├── routes/
│   │   └── agent.js       # Agent API路由
│   ├── services/
│   │   └── promptEngine.js # 提示词引擎
│   └── server.js
└── frontend/              # React前端
    ├── components/
    │   └── TripForm.jsx   # 用户输入表单
    └── App.jsx

步骤1:后端集成Agent(Node.js)

使用 langchain 的JavaScript SDK(无需Python环境):

js 复制代码
// backend/services/promptEngine.js
import { ChatOpenAI } from "@langchain/openai";
import { PromptTemplate } from "@langchain/core/prompts";

const llm = new ChatOpenAI({
  model: "gpt-4o-mini",
  temperature: 0.3,
  openAIApiKey: process.env.OPENAI_API_KEY,
});

const template = `你是一位资深旅行规划师,请为{travelers}设计一份{days}天{nights}晚的{style}风格旅游攻略。
总预算不超过{budget}元,需包含:
- 每日详细行程(含交通方式)
- 推荐住宿(名称+价格区间)
- 必吃美食(店名+人均)
- 适合拍照的打卡点
请以Markdown格式输出,不要使用任何XML标签。`;

export const generateTripPlan = async (params) => {
  const prompt = PromptTemplate.fromTemplate(template);
  const chain = prompt.pipe(llm);
  const response = await chain.invoke(params);
  return response.content;
};
js 复制代码
// backend/routes/agent.js
import express from 'express';
import { generateTripPlan } from '../services/promptEngine.js';

const router = express.Router();

router.post('/generate', async (req, res) => {
  try {
    const { travelers, budget, days, style } = req.body;
    const plan = await generateTripPlan({
      travelers,
      budget,
      days,
      nights: days - 1,
      style,
    });
    res.json({ success: true, plan });
  } catch (error) {
    res.status(500).json({ success: false, error: error.message });
  }
});

export default router;

步骤2:前端展示(React)

jsx 复制代码
// frontend/components/TripForm.jsx
import { useState } from 'react';

export default function TripForm() {
  const [inputs, setInputs] = useState({
    travelers: '情侣',
    budget: 5000,
    days: 3,
    style: '小众文艺'
  });
  const [plan, setPlan] = useState('');
  const [loading, setLoading] = useState(false);

  const handleSubmit = async (e) => {
    e.preventDefault();
    setLoading(true);
    const res = await fetch('/api/agent/generate', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(inputs)
    });
    const data = await res.json();
    setPlan(data.plan);
    setLoading(false);
  };

  return (
    <div>
      <form onSubmit={handleSubmit}>
        <input value={inputs.travelers} onChange={e => setInputs({...inputs, travelers: e.target.value})} placeholder="出行人群" />
        <input type="number" value={inputs.budget} onChange={e => setInputs({...inputs, budget: e.target.value})} placeholder="预算" />
        <input type="number" value={inputs.days} onChange={e => setInputs({...inputs, days: e.target.value})} placeholder="天数" />
        <select value={inputs.style} onChange={e => setInputs({...inputs, style: e.target.value})}>
          <option value="小众文艺">小众文艺</option>
          <option value="亲子休闲">亲子休闲</option>
          <option value="户外探险">户外探险</option>
        </select>
        <button type="submit" disabled={loading}>
          {loading ? '生成中...' : '生成攻略'}
        </button>
      </form>

      {plan && (
        <div className="markdown-output" dangerouslySetInnerHTML={{ __html: marked.parse(plan) }} />
      )}
    </div>
  );
}

注:前端需引入 marked 库将Markdown转为HTML。


常见问题与解决方案(Web开发者视角)

问题1:模型输出不稳定,有时漏掉住宿信息

原因 :提示词未强制约束输出结构。
解决方案 :在提示模板中加入输出格式示例(Few-shot Prompting)

text 复制代码
...(前面不变)
请严格按照以下格式输出:

# 第1天
- 上午:...
- 下午:...
- 住宿:XX酒店(¥300-400/晚)
- 美食:XX餐厅(人均¥80)
- 拍照点:...

# 第2天
...

问题2:高并发下API调用超时或限流

类比 :如同Web服务遭遇DDoS攻击。
解决方案

  • 后端增加请求队列(如BullMQ)
  • 使用缓存:对相同参数的请求缓存结果(Redis)
  • 前端加防抖:用户停止输入1秒后再提交

问题3:前端直接调用大模型API导致密钥泄露

错误做法

js 复制代码
// ❌ 千万不要在前端写API Key!
const response = await fetch('https://api.openai.com/v1/chat/completions', {
  headers: { Authorization: `Bearer ${process.env.API_KEY}` } // 会被打包进JS!
});

正确做法 :所有AI调用必须经由后端代理,前端只与自己的Node.js服务通信。


总结

本文通过构建一个旅游攻略系统,展示了Web开发者如何利用现有技术栈快速切入AI应用开发:

  • 提示词工程 = 需求结构化:把模糊用户输入转化为模型可理解的"组件props"
  • Agent集成 = 第三方API调用:用熟悉的HTTP/SDK方式接入AI能力
  • 输出控制 = 前端模板约束:通过示例和格式指令确保结果可用

推荐学习路径(针对Web开发者):

  1. 入门阶段:掌握提示词基础(角色设定、格式约束、少样本示例)
  2. 进阶阶段:学习LangChain.js,实现多步Agent(如先查天气再规划行程)
  3. 工程化阶段:集成向量数据库(如Pinecone)实现RAG(检索增强生成),让攻略基于真实游记数据
  4. 部署上线:用Vercel + Serverless Functions部署全栈应用

推荐资源:

Web开发者不是AI的局外人,而是AI应用的最佳构建者------因为我们最懂用户需求产品交付。从今天开始,用你的前端表单和后端服务,打造下一个爆款AI应用吧!

相关推荐
小脉传媒GEO7 小时前
GEO优化数据统计系统DeepAnaX系统详细介绍:构建企业级AI数据智能分析平台
人工智能·信息可视化
Coovally AI模型快速验证7 小时前
是什么支撑L3自动驾驶落地?读懂AI驾驶与碰撞预测
人工智能·深度学习·目标检测·机器学习·计算机视觉·自动驾驶
qq_172805597 小时前
Modbus Server数据采集Web之Server端模拟功能
前端·后端·golang·modbus
LYFlied7 小时前
【每日算法】LeetCode 739. 每日温度:从暴力遍历到单调栈的优雅解决
前端·算法·leetcode·面试·职场和发展
大、男人8 小时前
FastMCP高级特性之Proxy Servers(代理服务)
人工智能·fastmcp
Java后端的Ai之路8 小时前
【分析式AI】-LightGBM算法命名解释
人工智能·算法·机器学习·aigc·分析式ai
战场小包8 小时前
构建低延迟智能语音Agent实践
人工智能·aigc·agent
yingjuxia菜鸟com8 小时前
Vue Vuex详解,一文彻底搞懂Vuex
数据库·人工智能
烛阴8 小时前
深入 C# 字符串世界:基础语法、常用方法与高阶实战
前端·c#