# travel-agent **Repository Path**: Easettle/travel-agent ## Basic Information - **Project Name**: travel-agent - **Description**: No description available - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-05 - **Last Updated**: 2026-09-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # travel-agent —— AI Agent 差旅助手(Spring Boot + LangChain4j) 演示一个最小可运行的 **Agent**:用户说"我明天从武汉去成都出差,天气咋样、看下航班,如果不明确要求发送邮件,大模型不会去调用发送邮件的方法", Agent(LLM)自行决定**先调哪个工具、参数怎么填**,框架负责真正执行工具并把结果喂回 LLM 生成回答。 jdk 17以上 ## 核心设计:开发者编排 vs LLM 编排 | 层级 | 谁决定 | 本工程内容 | |---|---|---| | 能力边界(写死) | 开发者 | 注册 3 个 @Tool;系统提示限定"天气/航班走工具、禁止编造" | | 执行顺序(动态) | LLM | "明天去成都"→ 先 getToday 推算日期 → getWeather + searchFlights | ## 配置模型(三选一,通过环境变量注入) | 厂商 | MODEL_BASE_URL | MODEL_NAME | 获取 API Key | |---|---|---|---| | OpenAI | https://api.openai.com/v1 | gpt-4o-mini | platform.openai.com | | 通义千问 | https://dashscope.aliyuncs.com/compatible-mode/v1 | qwen-plus | dashscope.aliyuncs.com | | DeepSeek | https://api.deepseek.com/v1 | deepseek-chat | platform.deepseek.com | ```bash export MODEL_API_KEY="sk-你的key" export MODEL_BASE_URL="https://api.openai.com/v1" # 或上表通义/DeepSeek 地址 export MODEL_NAME="gpt-4o-mini" ``` ## 构建 & 启动 ```bash mvn clean package -DskipTests java -jar target/travel-agent-0.0.1-SNAPSHOT.jar ``` ## 调用示例 ```bash curl "http://localhost:8080/agent/ask?q=我明天从武汉去成都出差,成都天气咋样,帮我看下航班" ``` 预期返回(示例,取决于模型与工具返回): > 明天成都阵雨22~28℃,建议带伞和外套;武汉→成都有 MU2468(08:20 ¥730)和 CA1234(14:10 ¥810),按你的出差时间选即可。 ## 生产化建议 - **真实天气/航班**:把 `WeatherService` / `FlightService` 替换为对应开放平台 API 调用 - **出发地缺失**:from 未说时,用登录用户画像的城市补全,或反问 - **工具超时/降级**:工具内 catch 异常返回"服务暂不可用",让 LLM 决定降级话术 - **写操作需确认**:查是只读,若扩展"下单"等写接口,必须人工二次确认再调用 - **步数上限**:可在 AiServices 链路上加 maxIterations 防止 LLM 死循环调工具 ## 总结 [travel-system-prompt.txt](src/main/resources/travel-system-prompt.txt) skill 是什么 - SystemMessage 是把 Skill 用自然语言描述出来,让 LLM 在推理阶段能够遵循这些规则。 - SystemMessage 是 Skill 的“自然语言接口”,而不是 Skill 本身。 skill 是什么 - 如果没有写 @SystemMessage,LangChain4j 的动态代理在调用大模型时,就不会附带系统级的指令, - 大模型会完全基于你输入的 message(即 @UserMessage)以及挂载的 Tools(MCP 工具)来自由发挥。 - 如果没有@SystemMessage提示词,或者为空的话,Agent 就会变成脱离控制的“野生大模型”。