用 TRAE Builder+MCP+VibeCoding 做个超酷的AI旅游札记生成器
用 TRAE Builder+MCP+VibeCoding 做个超酷的AI旅游札记生成器
喜欢旅行但懒得写游记?
每次旅行回来,手机里存了几百张照片,却总觉得整理成一篇生动的游记太麻烦?写出来的文字又干巴巴的,完全配不上眼前的美景?别着急,今天我就来教你用TRAE Builder+MCP服务和VibeCoding技术,快速开发一个AI驱动的旅游札记生成应用!
这其实是我最激动的VibeCoding时刻了。
这个应用超厉害的:你只需要输入旅行的基本信息和照片,它就能自动分析照片内容,结合地理位置信息,生成风格多样、内容丰富的旅行札记,还支持Markdown、HTML、PDF等多种格式导出哦~
为什么要做这个应用?
兄弟们,你是不是也有这样的烦恼:
- 🤖 不想绞尽脑汁写游记:旅行已经够累了,回来还要写大段文字,想想就头大
- 📸 照片太多不知道怎么用:手机里存了几百张照片,却只能发朋友圈九宫格
- 🗺️ 想记录旅行足迹:每次旅行结束,都想看看自己走过的路线,超有成就感
- 💾 分享方式太单一:只能发朋友圈,想整理成正式一点的内容又嫌麻烦
- 🎨 想要个性化风格:每个人的旅行感受都不一样,当然要配不同风格的文字!
有了这个AI旅游札记生成器,这些问题都迎刃而解啦!
这个应用能做什么?
兄弟们,这个AI旅游札记生成器简直是旅行爱好者的神器!它能帮你:
- 📝 轻松收集信息:只需要输入目的地、日期、印象深刻的经历和照片,其他的交给AI就行
- 🔍 照片智能解读:TRAE MCP的图像分析服务就像你的私人导游,能自动识别照片里的场景、物体和氛围
- 🗺️ 地理位置魔法:高德地图MCP能把地址变成精确的经纬度,还能帮你搜索周边的隐藏景点
- ✍️ AI自动写札记:结合所有信息,生成超个性化的旅行故事,比你自己写的还精彩!
- 📤 多种格式导出:支持Markdown、HTML、PDF,想怎么分享就怎么分享,朋友圈、公众号、打印成册都行
- 📌 旅行足迹地图:把你的行程变成可视化的路线图,看着地图上的脚印,超有成就感!
是不是听起来就很心动?!
2. 技术架构大揭秘
2.1 整体架构图
兄弟们,虽然咱们做的是AI应用,但技术架构其实一点都不复杂!就像搭积木一样,几个部分互相配合就能完成所有功能:
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ │ │ │ │ │
│ 你输入信息的地方 ├────►│ 核心处理大脑 ├────►│ 导出和展示模块 │
│ │ │ │ │ │
└─────────────────┘ └─────────────────┘ └─────────────────┘
▲ ▲ ▲
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ │ │ │ │ │
│ TRAE AI服务 │ │ 高德地图服务 │ │ 本地存储系统 │
│ │ │ │ │ │
└─────────────────┘ └─────────────────┘ └─────────────────┘
是不是超简单?就三个主要部分:你输入信息的地方、核心处理大脑,还有导出和展示模块。然后每个模块都有对应的服务支持,TRAEMCP负责AI部分,高德地图负责地理位置,本地存储负责保存数据。
这么一说,是不是觉得技术架构也没那么神秘了?
2.2 应用的「心脏」和「手脚」
咱们的应用由几个关键部分组成,就像一个完整的人一样,每个部分都有自己的职责:
2.2.1 TRAE AI大脑
这是应用的智能核心,就像一个超级会写作文的导游,还能看懂照片!
- ✍️ 写作文小能手:根据你的旅行信息,生成不同风格的旅行故事,文艺、幽默、深度、简洁任你选
- 👁️ 照片解读大师:能看懂你拍的照片,知道里面有什么场景、物体,甚至能感受照片的氛围
2.2.2 高德地图助手
这个助手负责处理所有和地理位置相关的事情,就像你的私人GPS+
- 📍 地址变坐标:把「苏州桃花坞」这样的地址变成精确的经纬度坐标
- 🔄 坐标变地址:反过来,知道某个坐标点具体在什么地方
- 🔍 附近搜一搜:帮你找到周边的景点、餐厅、酒店等,超方便
- 📏 距离算一算:告诉你从一个地方到另一个地方有多远,走路要多久,开车要多久
2.2.3 核心协调员
这个部分就像个大管家,协调各个模块工作,让整个应用有条不紊地运行:
- 📝 收集信息:整理你输入的所有旅行信息,确保数据完整
- 📸 管理照片:把你的照片送到TRAE AI那里去分析,还会处理照片路径问题
- 🗺️ 整合地理:把地图信息和旅行内容完美结合,让札记更有空间感
- ✨ 生成札记:把所有信息变成一篇完整、生动的旅行故事
2.2.4 导出小助手
写完札记后,这个助手帮你保存和展示,想怎么分享就怎么分享:
- 📄 Markdown格式:原始文本格式,方便你自己编辑修改
- 🌐 HTML网页:漂亮的网页格式,支持手机查看,还能加样式
- 📑 PDF文档:可以打印出来的正式格式,适合做成旅行纪念册
- 📋 索引页面:把所有札记整理成目录,方便你查找和管理
这四个部分各司其职,又互相配合,就像一个默契的团队,帮你轻松生成高质量的旅行札记!
3. TRAE Builder+MCP服务实现
3.1 TRAE Builder开发环境
兄弟们,TRAE Builder真的是太好用了!它提供了完整的开发环境和工具链,让咱们开发基于MCP服务的应用变得超简单:
- 代码编辑器:集成了语法高亮、智能补全、代码导航等功能,写代码超顺手
- 调试工具:支持断点调试、变量查看、调用栈分析,找bug不再头疼
- MCP服务集成:提供可视化的MCP服务调用界面和参数配置,不用记复杂的API文档
- 版本控制:内置Git支持,代码管理和协作都方便
- 部署工具:支持一键部署到TRAE云平台,不用纠结服务器配置
有了TRAE Builder,咱们只需要专注于业务逻辑,其他的都交给工具就行!
3.2 MCP服务调用实现
3.2.1 TRAE MCP服务调用
在trae_mcp.py中实现了TRAE MCP服务的调用封装:
class TraeMCP:
def __init__(self, config: Dict[str, Any]):
self.api_key = config.get("trae_api_key")
self.api_url = config.get("trae_api_url", "https://api.trae.ai/v1")
self.headers = {
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
def call_service(self, service: str, params: Dict[str, Any]) -> Dict[str, Any]:
# 实现MCP服务调用逻辑
pass
def generate_text(self, prompt: str, **kwargs) -> Optional[str]:
# 调用文本生成服务
pass
def analyze_image(self, image_url: str, **kwargs) -> Optional[Dict[str, Any]]:
# 调用图像分析服务
pass
3.2.2 高德地图MCP服务调用
在amap_mcp.py中实现了高德地图MCP服务的调用封装:
class AmapMCP:
def __init__(self, config: Dict[str, Any]):
self.api_key = config.get("amap_api_key")
def geo_code(self, address: str, city: Optional[str] = None) -> Optional[Dict[str, Any]]:
# 调用地理编码服务
pass
def reverse_geo_code(self, location: str) -> Optional[Dict[str, Any]]:
# 调用逆地理编码服务
pass
def text_search(self, keywords: str, city: Optional[str] = None) -> Optional[Dict[str, Any]]:
# 调用文本搜索服务
pass
3.3 MCP服务容错处理
为提高系统稳定性,实现了完善的MCP服务容错机制:
- 模拟数据支持:当MCP服务调用失败或API密钥无效时,自动使用模拟数据
- 异常捕获:捕获网络请求异常、JSON解析异常等
- 用户友好提示:向用户展示清晰的错误信息和替代方案
4. VibeCoding开发体验
4.1 VibeCoding是什么?
兄弟们,VibeCoding简直是程序员的福音!它是一种全新的编程方式,不用再对着黑屏敲代码,只需要和AI用自然语言聊天,就能完成代码开发。这次做旅游札记应用,我就深度体验了一把VibeCoding的魅力,效率提升了不止一点半点!
4.2 VibeCoding开发流程
你知道用VibeCoding开发有多简单吗?就像和朋友聊天一样:
- 说需求:直接用中文告诉AI我想要一个能生成旅行札记的应用,要支持照片分析、地图功能这些
- 搭架构:和AI一起讨论应用该怎么设计,分成几个模块,每个模块负责什么
- 写代码:AI自动生成核心代码框架,我只需要稍微调整一下
- 调功能:哪里不对了,直接和AI说"这里有问题,帮我改一下",AI就会自动修复
- 做测试:AI还能自动生成测试用例,帮我优化代码质量
4.3 VibeCoding到底香不香?
用过之后我只能说,真的香!
- 省时间:以前写代码要查文档、写逻辑,现在直接说需求,AI分分钟生成代码,专注于想功能就行
- 智能助手:遇到bug不用头大,AI帮你找问题、给建议,比百度还好用
- 零门槛:不会编程的人也能开发应用,只要会说话就行!
- 迭代快:想法变了随时改,AI马上就能生成新代码,快速试错
- 涨知识:AI会给你讲技术原理,相当于免费请了个技术导师!
4.4 VibeCoding实践案例
在开发过程中,我们通过VibeCoding实现了多个复杂功能:
4.4.1 智能文本生成提示设计
def generate_travel_journal(mcp_client, user_input, photo_analysis, geolocation_data):
# 设计智能提示词,结合用户输入和分析结果
prompt = f"""
请为用户生成一篇{user_input['style']}风格的旅行札记,要求:
1. 目的地:{user_input['destination']}
2. 旅行日期:{user_input['travel_dates']}
3. 关键经历:{', '.join(user_input['key_experiences'])}
{f'4. 照片分析:{json.dumps(photo_analysis, ensure_ascii=False)}' if photo_analysis else ''}
{f'5. 地理位置信息:{json.dumps(geolocation_data, ensure_ascii=False)}' if geolocation_data else ''}
生成要求:
- {style_prompt}
- 结构清晰,有开头、中间、结尾
- 结合关键经历,描述当时的场景和感受
- 突出旅行的独特体验和个人感悟
"""
# 调用TRAE MCP文本生成服务
result = mcp_client.generate_text(prompt=prompt, model="trae-pro-1", max_tokens=2000, temperature=0.7, top_p=0.9)
return result
4.4.2 照片分析与内容整合
def analyze_photos(mcp_client: TraeMCP, photos: List[str]) -> List[Dict[str, Any]]:
if not photos:
return []
photo_analysis = []
print(f"\n正在分析 {len(photos)} 张照片...")
for i, photo in enumerate(photos, 1):
print(f"分析照片 {i}/{len(photos)}: {photo}")
result = mcp_client.analyze_image(photo)
if result:
photo_analysis.append({
"url": photo,
"tags": result.get("tags", []),
"scene": result.get("scene", ""),
"description": result.get("description", "")
})
else:
print(f" 分析失败: {photo}")
return photo_analysis
4.4.3 多格式导出功能
def export_to_html(journal_content: str, title: str, output_dir: str = "output") -> str:
# 确保输出目录存在
os.makedirs(output_dir, exist_ok=True)
# 将Markdown转换为HTML
html_content = markdown.markdown(journal_content)
# 构建完整的HTML页面
full_html = f"""
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{title}</title>
<!-- CSS样式 -->
</head>
<body>
<div class="container">
<header>
<h1>{title}</h1>
</header>
<main>
{html_content}
</main>
<footer>
<p>📸 这是一篇由AI生成的旅行札记</p>
<a href="index.html" class="back-link">返回首页</a>
</footer>
</div>
</body>
</html>
"""
# 保存HTML文件
filename = f"{title}_旅行札记.html".replace(" ", "_")
file_path = os.path.join(output_dir, filename)
with open(file_path, "w", encoding="utf-8") as f:
f.write(full_html)
return file_path
5. 功能模块大揭秘
5.1 用户输入模块
兄弟们,咱们先来看看用户输入模块!这个模块就像是你的旅行小助手,会一步步问你关于旅行的信息:
def get_user_input() -> Dict[str, Any]:
print("=== AI旅行札记生成器 ===")
print()
destination = input("请输入旅行目的地:")
travel_dates = input("请输入旅行日期(如:2025-01-01至2025-01-05):")
key_experiences = input("请描述几个印象深刻的经历(用逗号分隔):")
photos_input = input("请输入照片路径或URL(用逗号分隔,可留空):")
photos = [p.strip() for p in photos_input.split(",")] if photos_input.strip() else []
locations_input = input("请输入途经地点(用逗号分隔,可留空):")
locations = [l.strip() for l in locations_input.split(",")] if locations_input.strip() else []
style = input("请选择札记风格(文艺/幽默/深度/简洁,默认文艺):").strip() or "文艺"
return {
"destination": destination,
"travel_dates": travel_dates,
"key_experiences": [e.strip() for e in key_experiences.split(",")],
"photos": photos,
"locations": locations,
"style": style
}
是不是超简单?你只需要告诉它你去哪里玩了、什么时候去的、有什么难忘的经历、拍了什么照片,还有你想要什么风格的札记就行啦!
而且这个模块超贴心的,它还有这些小功能:
- 空值处理:不想填的信息可以直接跳过,比如没拍照片或者记不住途经地点都没关系,程序照样能运行!
- 格式规范化:你输入的内容它会自动整理,比如用逗号分隔的经历会变成整齐的列表
- 默认值设置:要是不知道选什么风格,它默认给你用文艺风格,超省心~
是不是超人性化?!
5.2 照片分析模块
兄弟们,照片分析模块可是咱们AI札记的灵魂之一!这个模块就像一个超懂摄影的旅行达人,能看懂你拍的每一张照片,还能说出照片背后的故事~
5.2.1 照片分析流程
你知道它是怎么工作的吗?其实超简单的:
-
照片上传:你可以把本地拍的照片路径或者网上的照片URL告诉它,支持多张哦!
-
批量分析:系统会自动对所有照片进行智能分析,每张照片都会被仔细检查:
- 场景识别:知道你拍的是山水风景、历史建筑还是美食
- 物体检测:认出照片里的人、车、建筑物、自然景观
- 特征提取:感知照片里的地点、天气、活动
- 内容描述生成:自动写出一段优美的文字描述,比你自己写的还生动!
-
结果整合:把所有照片的分析结果整理好,用来丰富你的旅行札记
5.2.2 照片分析结果怎么用?
这些分析结果可不是白做的,它们能让你的札记更精彩:
- 内容增强:根据照片内容自动插入相关描述,比如看到你拍了桃花坞入口的照片,就会自动加上"夜幕下的桃花坞入口,红灯笼映照着古牌坊"这样的描写
- 主题分类:根据照片内容自动把你的旅行经历分类,比如哪些是景点打卡,哪些是美食体验
- 情感色彩:根据照片的色调、构图调整文字风格,比如夕阳照片会用温暖的文字,雪景照片会用清新的文字
5.2.3 本地照片也支持哦!
咱们平时都是用手机拍照,所以系统专门支持本地照片:
# 本地照片路径示例
photos = [
"images/桃花坞入口.jpg",
"images/唐寅故居.jpg",
"images/报恩寺皆大欢喜牌匾.jpg"
]
# 照片分析结果示例
photo_analysis = [
{
"url": "images/桃花坞入口.jpg",
"tags": ["桃花坞", "入口", "古建筑", "夜景", "红灯笼"],
"scene": "历史建筑夜景",
"description": "夜幕下的桃花坞入口,古建筑牌坊前悬挂着红灯笼,营造出浓厚的历史氛围。",
"objects": ["牌坊", "红灯笼", "古墙", "石板路"]
},
# 其他照片分析结果...
]
看到没?系统能认出"桃花坞入口.jpg"这样的中文文件名,还能分析出照片里的红灯笼、古墙这些细节,是不是超厉害?!
5.2.4 错误处理与容错
当然啦,咱们的系统也很皮实,遇到问题不会轻易罢工:
- 网络异常处理:网络不好的时候也能工作,不会因为断网就崩溃
- 无效照片过滤:如果有的照片打不开或者格式不对,系统会自动跳过,不会影响整体效果
- 分析失败回退:要是照片分析失败了,系统会用默认的优美描述代替,保证札记质量
这就像是有个贴心的小助手,就算遇到问题也会想办法帮你搞定!
5.3 地理信息处理模块
兄弟们,地理信息处理模块就像是你的私人GPS导航,还带导游功能!它利用高德地图MCP服务,能把你说的地址变成地图上的精确位置,还能帮你计算路线、查天气,让你的旅行札记更有空间感~
5.3.1 地理信息处理流程
它是怎么工作的呢?其实很简单:
- 地址解析:把你说的"苏州桃花坞"、"杭州西湖"这样的地址,变成地图上精确的经纬度坐标
- 坐标转换:确保所有坐标都用同一个坐标系,这样地图显示才准确
- 路线计算:帮你算出各个景点之间的距离和时间,走路要多久,开车要多久
- 地图数据生成:生成能在地图上展示的数据,这样你就能看到自己的旅行足迹啦!
5.3.2 核心功能实现
咱们来看一下具体的代码实现,其实也不难理解:
def process_geolocation(amap_client: AmapMCP, user_input: Dict[str, Any]) -> Dict[str, Any]:
geolocation_data = {
"destination": None,
"locations": [],
"coordinates": [],
"weather_info": None
}
print("\n正在处理地理位置信息...")
# 处理目的地
if user_input.get("destination"):
print(f"处理目的地: {user_input['destination']}")
geo_result = amap_client.geo_code(user_input["destination"])
if geo_result:
geolocation_data["destination"] = {
"name": user_input["destination"],
"geocode": geo_result
}
# 获取目的地天气信息
city = geo_result["geocodes"][0].get("city", user_input["destination"])
weather_result = amap_client.weather(city)
if weather_result:
geolocation_data["weather_info"] = weather_result
# 处理途经地点
for location in user_input.get("locations", []):
print(f"处理途经地点: {location}")
geo_result = amap_client.geo_code(location)
if geo_result:
geolocation_data["locations"].append({
"name": location,
"geocode": geo_result
})
# 提取坐标信息
if geo_result.get("geocodes") and len(geo_result["geocodes"]) > 0:
location_info = geo_result["geocodes"][0]
coordinates = location_info.get("location")
if coordinates:
geolocation_data["coordinates"].append({
"name": location,
"coordinates": coordinates,
"address": location_info.get("formatted_address", location)
})
# 计算路线距离(如果有多个坐标点)
if len(geolocation_data["coordinates"]) > 1:
origins = geolocation_data["coordinates"][0]["coordinates"]
destination = geolocation_data["coordinates"][-1]["coordinates"]
distance_result = amap_client.distance(origins, destination, type=1) # 1表示驾车距离
if distance_result:
geolocation_data["route_distance"] = distance_result["results"][0].get("distance")
geolocation_data["route_duration"] = distance_result["results"][0].get("duration")
return geolocation_data
看到没?这个函数会先处理你的目的地,把它变成经纬度坐标,还会顺便查一下当地的天气!然后再处理你输入的途经地点,把它们都变成坐标点,最后如果有多个坐标点,还会帮你算出路线距离和时间。
这样一来,你的旅行札记里不仅有文字和照片,还能显示你走过的路线和当地的天气,是不是超有代入感?!
5.3.3 高德地图MCP服务功能
兄弟们,高德地图MCP服务可太强大了!它就像一个全能的地理信息助手,能帮咱们做这么多事:
- 地理编码:把"苏州桃花坞"这样的地址变成精确的经纬度坐标,就像给每个地点发了个定位器
- 逆地理编码:反过来,知道某个坐标点,就能说出它具体在什么地方,哪个城市、哪个街道
- 文本搜索:想找附近的美食?好玩的景点?直接搜关键词就行,超方便!
- 距离测量:算出两个地方之间的距离,走路要多久,开车要多久,规划路线超省心
- 天气查询:还能查当地的实时天气,这样你的札记里就能提到"那天阳光正好"或者"细雨朦胧"啦
5.3.4 地理信息在旅行札记中的应用
这些地理信息可不是白拿的,它们能让你的旅行札记超有画面感:
- 旅行足迹地图:生成一张包含所有途经地点的地图,看着地图上的脚印,超有成就感!
- 地点标记:在地图上标记你去过的重要景点和难忘经历,就像给旅行做了个记号
- 路线展示:绘制出你的旅行路线图,别人一看就知道你是怎么玩的
- 位置信息增强:在文本里自动插入地点的详细信息,比如"我在苏州市姑苏区桃花坞大街的唐寅故居,感受到了江南才子的气息"
5.3.5 坐标数据示例
咱们来看一个苏州旅游的坐标数据示例,是不是很直观?
# 苏州旅游坐标数据示例
coordinates_data = {
"destination": {
"name": "苏州",
"geocode": {
"formatted_address": "江苏省苏州市",
"location": "120.595497,31.298615"
}
},
"coordinates": [
{
"name": "桃花坞入口",
"coordinates": "120.590778,31.300361",
"address": "苏州市姑苏区桃花坞大街"
},
{
"name": "唐寅故居",
"coordinates": "120.592345,31.299876",
"address": "苏州市姑苏区桃花坞大街120号"
},
{
"name": "报恩寺",
"coordinates": "120.598765,31.297654",
"address": "苏州市姑苏区人民路1918号"
}
],
"weather_info": {
"lives": [
{
"city": "苏州市",
"weather": "晴",
"temperature": "25",
"winddirection": "东北",
"windpower": "3"
}
]
},
"route_distance": "2500", # 单位:米
"route_duration": "300" # 单位:秒
}
5.3.6 错误处理与容错
地理信息处理模块实现了以下错误处理机制:
- API调用失败处理:当高德地图API调用失败时,使用模拟数据回退
- 动态函数调用:支持不同版本的高德地图MCP服务函数名
- 无效地址过滤:自动过滤无法解析的地址
- 天气信息降级:当天气查询失败时,不影响主流程
5.4 旅行札记生成模块
兄弟们,这可是咱们应用的核心模块!
就像一个超会写故事的旅行作家,它能把你的旅行信息、照片分析结果和地理位置信息全部整合起来,生成一篇风格多样、内容丰富的旅行札记!
5.4.1 文本生成流程
你知道一篇生动的旅行札记是怎么生成的吗?其实超简单的:
第一步,收集素材:把你输入的旅行信息、照片分析结果、地理位置信息全部收集起来,就像准备写作文的素材一样~
第二步,设计提示词:根据你的素材,动态生成一个超个性化的提示词,告诉AI该怎么写
第三步,调整风格:你选了文艺风格?还是幽默风格?系统会根据你的选择调整提示词
第四步,AI创作:调用TRAE MCP的文本生成服务,让AI帮你写出一篇超棒的旅行札记
第五步,优化内容:对生成的文本进行一点点优化,让它更完美!
5.4.2 核心功能实现
咱们来看一下具体的代码实现,其实也不难理解:
def generate_travel_journal(mcp_client, user_input, photo_analysis=None, geolocation_data=None):
"""
生成旅行札记
参数:
mcp_client: TRAE MCP客户端
user_input: 用户输入信息
photo_analysis: 照片分析结果
geolocation_data: 地理信息数据
返回:
生成的旅行札记内容
"""
# 根据用户选择的风格生成不同的提示词
style = user_input.get("style", "文艺")
# 风格提示词模板
style_prompts = {
"文艺": "文字优美,富有诗意,注重情感表达和细节描写,使用生动的比喻和修辞手法。",
"幽默": "语言轻松活泼,充满幽默感,适当使用俏皮话和搞笑比喻,让读者感到愉悦。",
"深度": "深入思考旅行的意义,结合历史、文化、哲学等元素,表达深刻的人生感悟。",
"简洁": "语言简洁明了,重点突出,避免冗长的描述,用最少的文字传达最丰富的信息。"
}
style_prompt = style_prompts.get(style, style_prompts["文艺"])
# 构建基础提示词
prompt = f"""
请为用户生成一篇{style}风格的旅行札记,要求:
1. 目的地:{user_input['destination']}
2. 旅行日期:{user_input['travel_dates']}
3. 关键经历:{', '.join(user_input['key_experiences'])}
{f'4. 照片分析:{json.dumps(photo_analysis, ensure_ascii=False)}' if photo_analysis else ''}
{f'5. 地理位置信息:{json.dumps(geolocation_data, ensure_ascii=False)}' if geolocation_data else ''}
生成要求:
- {style_prompt}
- 结构清晰,有开头、中间、结尾
- 结合关键经历,描述当时的场景和感受
- 突出旅行的独特体验和个人感悟
- 避免使用过于口语化的表达
- 长度适中,控制在500-1500字之间
"""
# 调用TRAE MCP文本生成服务
print("\n正在生成旅行札记...")
result = mcp_client.generate_text(
prompt=prompt,
model="trae-pro-1",
max_tokens=2000,
temperature=0.7,
top_p=0.9
)
return result
5.4.3 提示词工程设计
提示词工程可是AI文本生成的关键! 咱们用了这些小技巧:
- 结构化提示:把信息分成不同部分,这样生成的内容就会更有条理
- 风格控制:用具体的风格描述词来控制文本的整体风格,想文艺就文艺,想幽默就幽默
- 内容约束:明确告诉AI要包含什么信息,要避免什么内容,这样生成的札记才不会跑题
- 长度控制:设定合适的长度范围,确保生成的内容不会太长也不会太短,刚刚好!
5.4.4 多模块集成
这个模块可不是孤军奋战,它和其他模块配合得超默契:
- 和用户输入模块合作:获取你输入的旅行信息和偏好
- 和照片分析模块合作:用照片分析结果来丰富文本内容,让札记更生动
- 和地理信息处理模块合作:结合地理信息来增强空间感,让读者仿佛跟着你一起旅行
- 和导出模块合作:把生成的文本传递给导出模块,转换成你想要的格式
5.4.5 文本生成优化
为了让生成的札记更完美,咱们还做了这些优化:
- 多轮生成:对于复杂的旅行札记,采用多轮生成的策略,确保内容更丰富
- 内容过滤:过滤掉不相关或质量不佳的内容,只留下最好的
- 格式调整:确保生成的内容符合Markdown格式要求,方便后续导出
- 个性化调整:根据用户的反馈不断优化生成内容,让它越来越符合你的期望!
5.4.6 生成结果示例
咱们来看一个生成的苏州夜游札记示例,是不是超棒?!
# 苏州夜游札记
## 2026年1月6日
夜幕降临,华灯初上,我终于来到了这座充满诗意的古城——苏州。
### 桃花坞入口
夜幕下的桃花坞入口,古建筑牌坊前悬挂着红灯笼,营造出浓厚的历史氛围。我站在入口处,仿佛穿越回了古代,想象着唐寅、祝枝山等文人墨客曾在此饮酒作诗的场景。
### 唐寅故居
走进唐寅故居,一股淡淡的墨香扑面而来。在烛光的映照下,我仿佛看到了唐寅正在挥毫泼墨,创作着他的传世佳作。墙上的字画,桌上的文房四宝,都在诉说着这位明代才子的传奇人生。
### 报恩寺
最后一站是报恩寺,寺内的"皆大欢喜"牌匾让我印象深刻。在这宁静的夜晚,寺庙的钟声回荡在空气中,让我的心灵得到了前所未有的平静。
苏州之夜,如同一幅美丽的画卷,让人流连忘返。这次夜游不仅让我领略了苏州的历史文化,更让我感受到了这座古城的独特魅力。
5.5 导出与展示模块
**写好札记后,怎么分享给朋友呢?**别担心,导出与展示模块帮你搞定!
这个模块负责把生成的旅行札记导出成多种格式,还能创建一个索引页面,让你轻松管理所有的旅行札记:
- Markdown:原始格式,方便你自己编辑和分享
- HTML:超美观的网页格式,支持手机、电脑等各种设备
- PDF:可以打印的文档格式,适合做成旅行纪念册
是不是超贴心?!
5.5.1 核心功能实现
def export_to_html(journal_content: str, title: str, output_dir: str = "output") -> str:
# 确保输出目录存在
os.makedirs(output_dir, exist_ok=True)
# 将Markdown转换为HTML
html_content = markdown.markdown(journal_content)
# 构建完整的HTML页面
full_html = f"""
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{title}</title>
<!-- CSS样式 -->
</head>
<body>
<div class="container">
<header>
<h1>{title}</h1>
</header>
<main>
{html_content}
</main>
<footer>
<p>📸 这是一篇由AI生成的旅行札记</p>
<a href="index.html" class="back-link">返回首页</a>
</footer>
</div>
</body>
</html>
"""
# 保存HTML文件
filename = f"{title}_旅行札记.html".replace(" ", "_")
file_path = os.path.join(output_dir, filename)
with open(file_path, "w", encoding="utf-8") as f:
f.write(full_html)
return file_path
5.5.2 响应式设计
生成的HTML页面采用响应式设计,支持各种设备和屏幕尺寸:
@media (max-width: 768px) {
.container {
padding: 15px;
}
h1 {
font-size: 2em;
}
.image-grid {
grid-template-columns: minmax(250px, 1fr);
}
}
5.5.3 索引页面生成
索引页面展示所有生成的旅行札记,方便用户浏览和管理:
def create_index_page(journal_files: List[str], output_dir: str = "output") -> str:
# 构建索引页面内容
index_content = """
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>旅行札记索引</title>
<style>
/* 索引页面样式 */
</style>
</head>
<body>
<div class="container">
<header>
<h1>我的旅行札记</h1>
</header>
<main>
<ul class="journal-list">
"""
# 添加所有旅行札记链接
for journal_file in journal_files:
filename = os.path.basename(journal_file)
title = filename.replace("_旅行札记.html", "").replace("_", " ")
index_content += f"<li><a href=\"{filename}\">{title}</a></li>\n"
# 完成索引页面
index_content += """
</ul>
</main>
</div>
</body>
</html>
"""
# 保存索引页面
index_file = os.path.join(output_dir, "index.html")
with open(index_file, "w", encoding="utf-8") as f:
f.write(index_content)
return index_file
5.6 配置管理模块
兄弟们,配置管理模块就像是咱们应用的"钥匙串",专门负责管理所有API密钥和服务地址这些重要信息!
5.6.1 配置文件结构
{
"trae_api_key": "your_trae_api_key_here",
"trae_api_url": "https://api.trae.ai/v1",
"amap_api_key": "your_amap_api_key_here"
}
5.6.2 核心功能实现
def load_config() -> Dict[str, Any]:
"""
加载配置文件
返回:
配置字典
"""
config_file = "config.json"
# 如果配置文件不存在,创建一个示例配置
if not os.path.exists(config_file):
example_config = {
"trae_api_key": "your_trae_api_key_here",
"trae_api_url": "https://api.trae.ai/v1",
"amap_api_key": "your_amap_api_key_here"
}
with open(config_file, "w", encoding="utf-8") as f:
json.dump(example_config, f, ensure_ascii=False, indent=2)
print(f"已创建示例配置文件:{config_file}")
print("未检测到有效配置,将使用模拟数据运行应用")
return example_config
# 加载配置文件
with open(config_file, "r", encoding="utf-8") as f:
config = json.load(f)
# 验证配置
if not config.get("trae_api_key") or config["trae_api_key"] == "your_trae_api_key_here":
print("注意:未设置有效的TRAE API密钥,将使用模拟数据")
# 高德地图API密钥是可选的
if not config.get("amap_api_key") or config["amap_api_key"] == "your_amap_api_key_here":
print("注意:未设置有效的高德地图API密钥,地理信息功能将使用模拟数据")
return config
5.6.3 配置容错机制
配置管理模块实现了以下容错机制:
- 自动创建配置:当配置文件不存在时,自动创建示例配置
- 模拟数据降级:当API密钥无效时,使用模拟数据运行
- 友好提示:向用户显示清晰的配置状态信息
5.7 错误处理与日志系统
5.7.1 全局错误处理
咱们的应用可是个"能屈能伸"的好帮手!即使遇到问题也不会一下子崩溃,而是会优雅地处理各种异常:
def main():
"""
主程序入口
"""
try:
# 主程序逻辑
...
except KeyboardInterrupt:
print("\n\n程序已中断")
except Exception as e:
print(f"\n❌ 程序执行出错: {e}")
import traceback
traceback.print_exc()
5.7.2 MCP服务错误处理
在调用MCP服务时,实现了多层错误处理:
def call_service(self, service: str, params: Dict[str, Any]) -> Dict[str, Any]:
url = f"{self.api_url}/services/{service}"
try:
response = requests.post(
url=url,
headers=self.headers,
json=params,
timeout=30
)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
print(f"调用TRAE MCP服务失败: {e}")
return {"error": str(e)}
except json.JSONDecodeError as e:
print(f"解析TRAE MCP服务响应失败: {e}")
return {"error": str(e)}
5.7.3 日志记录
应用使用简单有效的日志记录机制,便于调试和问题追踪:
- 控制台输出:关键操作和错误信息实时输出到控制台
- 操作提示:向用户显示清晰的操作状态和进度
- 错误追踪:在遇到异常时,显示详细的错误堆栈信息
5.8 性能优化
5.8.1 批量处理
照片分析和地理信息处理采用批量处理方式,提高效率:
def analyze_photos(mcp_client: TraeMCP, photos: List[str]) -> List[Dict[str, Any]]:
if not photos:
return []
photo_analysis = []
print(f"\n正在分析 {len(photos)} 张照片...")
for i, photo in enumerate(photos, 1):
print(f"分析照片 {i}/{len(photos)}: {photo}")
# 单张照片分析...
return photo_analysis
5.8.2 异步调用潜力
代码设计预留了异步调用的扩展空间,可以通过以下方式实现:
import asyncio
async def analyze_photos_async(mcp_client: TraeMCP, photos: List[str]) -> List[Dict[str, Any]]:
# 异步批量分析照片
tasks = [analyze_single_photo(mcp_client, photo) for photo in photos]
return await asyncio.gather(*tasks)
5.8.3 缓存机制
可以扩展实现缓存机制,避免重复调用API:
class ApiCache:
def __init__(self, max_size=100):
self.cache = {}
self.max_size = max_size
def get(self, key):
return self.cache.get(key)
def set(self, key, value):
if len(self.cache) >= self.max_size:
# 简单的LRU缓存淘汰策略
self.cache.pop(next(iter(self.cache)))
self.cache[key] = value
6. 部署与使用指南
6.1 环境要求
兄弟们,咱们的应用对环境要求可不高!只要你有:
- Python 3.7以上版本(现在谁还不用Python3啊)
- pip包管理工具(Python自带的,不用额外装)
- 能上网就行(要调用MCP服务嘛)
6.2 安装与配置
想体验AI生成旅行札记?跟着我三步搞定!
- 获取项目代码
先把项目克隆到你的电脑上:
git clone <项目地址> # 替换成你自己的项目地址哦
cd travel-journal-generator
- 安装依赖
一行命令安装所有需要的库,超简单:
pip install -r requirements.txt
- 配置API密钥
打开config.json文件,把你的TRAE和高德地图API密钥填进去就行:
{
"trae_api_key": "你的TRAE密钥",
"trae_api_url": "https://api.trae.ai/v1", // 这个不用改
"amap_api_key": "你的高德地图密钥"
}
6.3 运行应用
配置好了?那咱们来启动应用吧!
cd src
python journal_generator.py
6.4 使用流程
启动应用后,跟着提示一步步来:
- 输入你去哪里玩了(比如"苏州"、“大理”)
- 选择你想要的札记风格(文艺/幽默/深度/简洁,随便选,不满意可以重来)
- 上传你拍的照片(可选,但有照片的话生成的札记更生动哦)
- 输入途经的地点(可选,比如"桃花坞"、“唐寅故居”)
- 等待几秒钟,AI就会帮你生成一篇超棒的旅行札记
- 选择你想要的导出格式(Markdown/HTML/PDF,想怎么分享就怎么分享)
- 最后在
output目录里就能找到你生成的旅行札记啦!
6.5 高级用法
6.5.1 批量生成
可以通过脚本实现批量生成旅行札记:
def batch_generate_journals(inputs_file: str):
# 从文件读取批量输入
with open(inputs_file, "r", encoding="utf-8") as f:
inputs = [json.loads(line) for line in f]
# 初始化客户端
config = load_config()
mcp_client = TraeMCP(config)
amap_client = AmapMCP(config)
# 批量生成
for i, user_input in enumerate(inputs, 1):
print(f"\n=== 生成第 {i}/{len(inputs)} 篇旅行札记 ===")
# 生成逻辑...
6.5.2 自定义风格
可以通过修改style_prompts字典,添加自定义的札记风格:
style_prompts = {
"文艺": "文字优美,富有诗意...",
"幽默": "语言轻松活泼...",
"深度": "深入思考旅行的意义...",
"简洁": "语言简洁明了...",
"古风": "使用文言文或古风语言,富有古典韵味...",
"科技感": "使用现代科技词汇,突出数字化体验..."
}
7. 总结与展望
7.1 项目总结
兄弟们,咱们的AI旅游札记生成应用终于搞定啦!基于TRAE Builder+MCP服务和VibeCoding技术,咱们开发出了一个功能超全、体验超棒的旅行小伙伴。它能帮你做什么呢?
- 🤖 智能旅行札记生成:输入旅行信息,AI分分钟给你写出一篇文采飞扬的游记
- 📸 照片内容分析:上传照片,AI能识别场景、物体,自动融入札记内容
- 🗺️ 地理信息整合:结合高德地图,帮你标记位置、绘制路线,让游记更有画面感
- 💾 多格式导出:支持Markdown/HTML/PDF,想怎么分享就怎么分享
- 📍 旅行足迹地图:自动生成你的旅行路线图,记录每一个美好瞬间
通过TRAE MCP服务,咱们实现了强大的AI内容生成和分析能力;而VibeCoding技术更是让开发效率飙升,代码质量也杠杠的!
7.2 技术亮点
咱们的项目可不是花架子,技术上也有很多亮点哦:
- 模块化设计:代码结构清晰,像搭积木一样,维护和扩展超方便
- 容错机制:就算网络出问题,也能用模拟数据顶上去,系统稳得一批
- 响应式设计:生成的HTML页面在手机、电脑上都能完美显示,怎么看都舒服
- 用户友好:操作流程简单明了,就算是技术小白也能轻松上手
- 可扩展性:想加新功能?没问题!直接插模块就行,超级灵活
- 优雅降级:API调用失败也不怕,自动切换到备用方案,保证系统不停摆
- 灵活配置:通过配置文件就能自定义系统行为,想怎么玩就怎么玩
7.3 实际应用案例
光说不练假把式,咱们来看看实际使用效果吧!
7.3.1 苏州夜游札记生成
输入信息:
- 目的地:苏州
- 旅行日期:2026年1月6日
- 关键经历:桃花坞入口、唐寅故居、报恩寺
- 照片:苏州夜景照片
- 风格:文艺
生成结果:
# 苏州夜游札记
## 2026年1月6日
夜幕降临,华灯初上,我终于来到了这座充满诗意的古城——苏州。
### 桃花坞入口
夜幕下的桃花坞入口,古建筑牌坊前悬挂着红灯笼,营造出浓厚的历史氛围。我站在入口处,仿佛穿越回了古代,想象着唐寅、祝枝山等文人墨客曾在此饮酒作诗的场景。
### 唐寅故居
走进唐寅故居,一股淡淡的墨香扑面而来。在烛光的映照下,我仿佛看到了唐寅正在挥毫泼墨,创作着他的传世佳作。墙上的字画,桌上的文房四宝,都在诉说着这位明代才子的传奇人生。
### 报恩寺
最后一站是报恩寺,寺内的"皆大欢喜"牌匾让我印象深刻。在这宁静的夜晚,寺庙的钟声回荡在空气中,让我的心灵得到了前所未有的平静。
苏州之夜,如同一幅美丽的画卷,让人流连忘返。这次夜游不仅让我领略了苏州的历史文化,更让我感受到了这座古城的独特魅力。
7.3.2 大理自驾游札记生成
再来看看另一个案例——大理自驾游:
输入信息:
- 目的地:大理
- 旅行日期:2025年3月15日至2025年3月20日
- 关键经历:洱海骑行、喜洲古镇、苍山日出
- 照片:洱海风光、骑行照片
- 风格:深度
生成结果:
# 大理自驾之旅
## 2025年3月15日至2025年3月20日
大理,这座位于云南高原上的古城,承载着太多的诗意与浪漫。当我驾车行驶在洱海边的公路上,微风轻拂脸颊,湖水波光粼粼,远处的苍山云雾缭绕,宛如仙境。
### 洱海骑行
清晨,我租了一辆自行车,沿着洱海骑行。路边的樱花正盛,粉色的花瓣随风飘落,落在我的肩膀上,落在湖面上,构成了一幅绝美的画卷。我停下脚步,坐在湖边的石头上,静静地欣赏着眼前的美景,感受着大自然的宁静与美好。
### 喜洲古镇
午后,我来到了喜洲古镇。这里保存着完好的白族民居建筑,青瓦白墙,雕梁画栋,处处透露着古朴的韵味。我在古镇的小巷中漫步,品尝了当地特色的喜洲粑粑,酥脆的外皮包裹着香甜的豆沙馅,让人回味无穷。古镇的居民们热情好客,主动与我打招呼,向我介绍当地的历史文化。
### 苍山日出
最后一天,我起了个大早,驾车前往苍山。当第一缕阳光洒在洱海的湖面上,整个世界都被染成了金黄色。那一刻,我仿佛与大自然融为一体,心中充满了宁静与感动。我想起了诗人顾城的诗句:"黑夜给了我黑色的眼睛,我却用它寻找光明。"在这片美丽的土地上,我找到了内心的光明。
大理之旅,不仅是一次视觉的盛宴,更是一次心灵的洗礼。这里的山山水水,这里的人文风情,都将永远留在我的记忆中。
7.4 未来展望
咱们的项目还在不断进化中,未来还有很多精彩功能要上线哦:
- 增强AI能力:整合更多AI模型,让生成的内容更有创意、更个性化
- 用户界面优化:开发Web界面和移动应用,随时随地都能生成游记
- 社交分享功能:一键分享到朋友圈、微博,让你的旅行故事被更多人看到
- 多语言支持:支持中英文等多种语言,出国旅行也能用
- 个性化推荐:根据你的旅行喜好,推荐适合的目的地和玩法
- 地图可视化增强:提供更炫酷的旅行足迹地图,让你的旅行轨迹一目了然
- 离线支持:增加离线模式,支持在无网络环境下使用
通过不断的优化和扩展,我们相信这个应用将成为旅行者记录和分享美好回忆的得力助手。
8. 参考文献
这里给大家整理了一些有用的文档链接,如果想深入了解项目中用到的技术,可以点击查看:
- TRAE MCP服务文档 - 了解TRAE MCP的各种强大功能
- 高德地图MCP服务文档 - 学习高德地图MCP的使用方法
- Markdown语法指南 - 掌握Markdown写作技巧
- Python官方文档 - Python编程必备参考
- VibeCoding技术白皮书 - 深入了解VibeCoding技术原理
9. 附录
最后,给大家整理了一些实用的参考资料,方便大家深入了解项目:
9.1 项目文件结构
项目的文件结构清晰明了,一眼就能看出各个文件的作用:
├── src/ # 源代码目录
│ ├── journal_generator.py # 主程序入口,运行它就启动应用
│ ├── trae_mcp.py # TRAE MCP服务客户端,负责AI功能
│ ├── amap_mcp.py # 高德地图MCP服务客户端,负责地理信息
│ ├── export.py # 导出功能模块,支持多种格式
│ └── output/ # 输出目录,生成的札记都在这里
├── images/ # 示例照片目录,放你旅行的照片
├── output/ # 导出文件目录,保存各种格式的札记
├── config.json # 配置文件,填API密钥的地方
├── requirements.txt # 依赖列表,需要安装的库都在这里
└── vibecoding_experience.md # 就是你现在看的这份文档啦
9.2 核心依赖
项目依赖的库不多,但都是精品,一行命令就能全部安装:
requests>=2.25.1 # 网络请求库,负责调用API
markdown>=3.3.4 # Markdown处理库,用于生成HTML
weasyprint>=53.4 # PDF导出库,把游记转成PDF
pydantic>=1.8.2 # 数据验证库,确保输入数据正确
9.3 示例运行结果
看看应用运行时的实际效果吧,操作流程超级简单:
=== AI旅行札记生成器 ===
请输入旅行目的地:大理 # 告诉AI你去哪里玩了
请输入旅行日期(如:2025-01-01至2025-01-05):2025-03-15至2025-03-20 # 旅行的时间
请描述几个印象深刻的经历(用逗号分隔):洱海骑行,喜洲古镇,苍山日出 # 分享你的精彩瞬间
请输入照片路径或URL(用逗号分隔,可留空): # 可以上传照片,让游记更生动
请输入途经地点(用逗号分隔,可留空): # 途经的地方也可以告诉AI
请选择札记风格(文艺/幽默/深度/简洁,默认文艺):文艺 # 选择你喜欢的文风
正在处理地理位置信息... # AI开始工作了
处理目的地: 大理
正在生成旅行札记...
### 9.4 常见问题与解答
遇到问题?别慌!这里整理了大家最常问的几个问题:
#### Q: 为什么照片分析失败了?
A: 可能的原因有这几个:
1. 照片链接失效了,或者根本访问不了
2. 照片格式不对,系统不支持
3. 网络不给力,连不上服务器
4. TRAE MCP服务暂时出了点小问题
不过别担心,就算照片分析失败,系统也会用模拟数据继续运行,不会影响你生成游记的!
#### Q: 地理信息功能怎么用不了?
A: 可能是这几个原因:
1. 你忘记填高德地图的API密钥了吧?
2. 你输入的地址太模糊,系统找不到
3. 高德地图的服务暂时有点问题
同样的,系统会自动切换到模拟数据,保证你能继续生成游记。
#### Q: 我想自定义札记风格,怎么操作?
A: 简单!找到代码里的`style_prompts`字典,直接添加你想要的风格就行啦。
#### Q: 我想导出其他格式,比如Word,可以吗?
A: 当然可以!你只需要扩展`export.py`模块,添加新的导出格式支持就行。
#### Q: 怎么让生成的游记质量更高?
A: 给你几个小技巧:
1. 旅行信息越详细越好,特别是那些印象深刻的经历
2. 上传高质量的旅行照片,让AI能更好地理解你的旅行
3. 选择合适的札记风格,匹配你的旅行主题
4. 提供准确的途经地点,让地理信息更精准
### 9.5 贡献指南
喜欢这个项目?想一起让它变得更好?欢迎来贡献你的力量!
1. **提交Bug报告**:如果发现问题,在GitHub Issues里详细说说怎么复现的,我们会尽快解决
2. **提出功能建议**:有好想法?在GitHub Discussions里分享你的创意,大家一起讨论
3. **提交代码修复**:想直接改代码?没问题!
- 先Fork项目仓库
- 创建一个新分支:`git checkout -b feature/你的功能名`
- 提交代码:`git commit -m "Add feature: 你的功能名"`
- 推送分支:`git push origin feature/你的功能名`
- 最后创建Pull Request就行啦
4. **完善文档**:发现错别字?想加个例子?尽管改!文档越详细越好
5. **提供测试用例**:给现有功能加个测试,让代码更稳定,我们万分感谢
### 9.6 开发规范
为了让大家写的代码看起来像一个人写的,也方便后续维护,我们制定了一些简单的规范:
#### 9.6.1 代码风格
- 遵循Python的PEP 8规范,这是Python开发者的通用标准
- 缩进用4个空格,不要用Tab键
- 变量名和函数名用小写字母加下划线,比如`travel_date`、`generate_journal`
- 类名用驼峰命名法,比如`TraeMCP`、`AmapMCP`
- 记得给所有函数和类写详细的文档字符串,说明它们是干嘛的,怎么用
#### 9.6.2 提交规范
- 提交信息用中文写,格式:`类型: 描述`
- 类型有这些:
- `feat`:添加了新功能
- `fix`:修复了Bug
- `docs`:更新了文档
- `style`:代码风格调整(不影响功能)
- `refactor`:重构了代码(不影响功能)
- `test`:添加或修改了测试
- `chore`:构建或工具相关的修改
- 描述要简洁明了,让别人一眼就知道你改了什么,为什么改
更多推荐




所有评论(0)