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应用吧!

相关推荐
人工智能训练21 小时前
【极速部署】Ubuntu24.04+CUDA13.0 玩转 VLLM 0.15.0:预编译 Wheel 包 GPU 版安装全攻略
运维·前端·人工智能·python·ai编程·cuda·vllm
会跑的葫芦怪1 天前
若依Vue 项目多子路径配置
前端·javascript·vue.js
源于花海1 天前
迁移学习相关的期刊和会议
人工智能·机器学习·迁移学习·期刊会议
DisonTangor1 天前
DeepSeek-OCR 2: 视觉因果流
人工智能·开源·aigc·ocr·deepseek
薛定谔的猫19821 天前
二十一、基于 Hugging Face Transformers 实现中文情感分析情感分析
人工智能·自然语言处理·大模型 训练 调优
发哥来了1 天前
《AI视频生成技术原理剖析及金管道·图生视频的应用实践》
人工智能
数智联AI团队1 天前
AI搜索引领开源大模型新浪潮,技术创新重塑信息检索未来格局
人工智能·开源
不懒不懒1 天前
【线性 VS 逻辑回归:一篇讲透两种核心回归模型】
人工智能·机器学习
冰西瓜6001 天前
从项目入手机器学习——(四)特征工程(简单特征探索)
人工智能·机器学习
Ryan老房1 天前
未来已来-AI标注工具的下一个10年
人工智能·yolo·目标检测·ai