基于火山引擎 Doubao Pro 1.5 接口的船舶检验监督管理系统:自主决策的智能实践
在数字化转型的浪潮中,人工智能(AI)正在逐步改变传统行业的运作方式。作为一名对智能系统设计充满热情的开发者,我最近使用 原生 llm ide 平台 Trae ,设计并实现了一个基于火山引擎 Doubao Pro 1.5 接口的自主决策系统,用于船舶检验监督管理。这个系统不仅展示了 AI 在业务流程自动化中的潜力,还通过大模型的智能决策能力简化了复杂的监督任务。
在这篇博客中,我将分享系统的设计背景、实现细节以及 Trae 在开发过程中的关键贡献,同时附上核心代码和未来的优化方向。
背景:从人工监督到智能决策
船舶检验监督管理是确保水上交通安全的重要环节,涉及投诉处理、风险评估、检查规划、船舶检验、整改验证等多个步骤。传统上,这些任务依赖人工操作,效率较低且容易出错。随着 AI 技术的发展,尤其是大语言模型(LLM)的成熟,我开始思考如何利用 AI 实现这一流程的自动化。
在与 Trae 的交流中,我提出了一个目标:设计一个系统,能够基于《船舶检验监督管理规定》的要求,自主完成从投诉接收到整改验证的全流程。Trae 建议利用火山引擎的 Doubao Pro 1.5 接口,通过指令调用大模型生成决策,取代传统的多智能体协作模式,简化系统架构并提升智能化水平。
设计思路:单一智能体的自主决策
Trae 帮助我将复杂的多智能体系统整合为一个单一智能体的工作流程,核心思路是:
-
集中式控制:
- 由一个智能体负责所有任务,避免多智能体间的协作复杂性。
- 通过线性流程按步骤处理:投诉记录、风险评估、计划制定、船舶检查、整改验证和反馈分析。
-
大模型驱动:
- 使用 Doubao Pro 1.5 接口,通过精心设计的提示词(prompt)让模型生成每一步的决策。
- 模型输出 JSON 格式的结果,包含行动(
action
)和数据(data
),便于程序解析和执行。
-
自主性:
- 智能体在每个步骤中调用模型,根据当前状态和数据自主决定下一步行动。
- 通过数据库记录状态,确保流程的连续性和可追溯性。
-
简化实现:
- 不依赖多线程或消息队列,采用单线程顺序执行,降低开发和维护成本。
Trae 的建议让我从繁琐的分布式设计转向一个更简洁、高效的方案,同时保留了智能决策的核心优势。
代码实现:Trae 的贡献
在 Trae 的指导下,我完成了以下核心代码实现。完整代码基于 Python,使用 requests
库调用火山引擎 API,并结合 SQLite 数据库存储状态。
核心代码
python
import requests
import json
import time
from datetime import datetime
import logging
import sqlite3
# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
# API 配置
API_URL = "https://ark.cn-beijing.volces.com/api/v3/chat/completions"
API_KEY = ""
MODEL = "doubao-1-5-pro-32k-250115"
HEADERS = {
"Content-Type": "application/json",
"Authorization": f"Bearer {API_KEY}"
}
# 数据库类
class Database:
def __init__(self, db_name: str = "inspection.db"):
self.conn = sqlite3.connect(db_name)
self.create_tables()
def create_tables(self):
with self.conn:
self.conn.execute('''
CREATE TABLE IF NOT EXISTS records (
id INTEGER PRIMARY KEY AUTOINCREMENT,
key TEXT UNIQUE,
value TEXT,
timestamp TEXT
)
''')
def save(self, key: str, value: dict):
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
with self.conn:
self.conn.execute('INSERT OR REPLACE INTO records (key, value, timestamp) VALUES (?, ?, ?)',
(key, str(value), timestamp))
logging.info(f"数据保存: {key} -> {value}")
def fetch(self, key: str) -> dict:
with self.conn:
cursor = self.conn.execute('SELECT value FROM records WHERE key = ?', (key,))
result = cursor.fetchone()
return eval(result[0]) if result else {}
def fetch_all(self) -> list:
with self.conn:
cursor = self.conn.execute('SELECT value FROM records')
return [eval(row[0]) for row in cursor.fetchall()]
# 智能体类
class InspectionAgent:
def __init__(self, db: Database):
self.db = db
self.step_mapping = {
"handle_complaint": "record_complaint",
"assess_risk": "assess_risk",
"create_plan": "create_plan",
"inspect_ship": "inspect_ship",
"wait_rectification": "wait_rectification",
"verify_rectification": "verify_rectification",
"analyze_feedback": "analyze_feedback",
"complete": "complete"
}
self.action_to_step = {
"Initiate risk assessment for the ship": "assess_risk",
"Create an inspection plan": "create_plan",
"Conduct ship inspection": "inspect_ship",
"Wait for rectification": "wait_rectification",
"Verify rectification": "verify_rectification",
"Analyze and provide feedback": "analyze_feedback",
"Complete process": "complete"
}
def call_model(self, step: str, data: dict, history: list) -> dict:
# 构造包含历史状态的提示词
system_prompt = (
"你是船舶检验监督管理的人工智能助手,负责处理投诉、评估风险、制定计划、检查船舶、验证整改并提供改进建议。"
"根据当前步骤、数据和历史状态,生成具体的决策和行动建议,输出 JSON 格式的结果,包括 'action' 和 'data' 字段。"
"可能的 action 包括:'Initiate risk assessment for the ship', 'Create an inspection plan', "
"'Conduct ship inspection', 'Wait for rectification', 'Verify rectification', "
"'Analyze and provide feedback', 'Complete process'。"
f"当前步骤: {step}\n当前数据: {json.dumps(data, ensure_ascii=False)}\n"
f"历史状态: {json.dumps(history, ensure_ascii=False)}"
)
user_prompt = (
"请根据当前步骤、数据和历史状态,决定下一步行动并生成相应的结果。确保根据历史状态推进流程,避免重复相同的决策。"
)
payload = {
"model": MODEL,
"messages": [
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_prompt}
]
}
try:
response = requests.post(API_URL, headers=HEADERS, data=json.dumps(payload))
response.raise_for_status()
result = response.json()
content = result["choices"][0]["message"]["content"]
logging.info(f"模型响应: {content}")
return json.loads(content)
except Exception as e:
logging.error(f"调用模型失败: {e}")
return {"action": "error", "data": data}
def act(self, decision: dict, current_step: str) -> tuple:
action = decision["action"]
data = decision["data"]
next_step = self.action_to_step.get(action, "unknown")
if current_step == "handle_complaint" or action == "Initiate risk assessment for the ship":
report = {
"complaint": data["complaint"],
"ship_id": data["ship_id"],
"ship_type": data["ship_type"],
"status": "待检查",
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
}
self.db.save(f"report_{data['ship_id']}", report)
return "assess_risk", report
elif action == "Create an inspection plan":
plan = {
"ship_type": data["ship_type"],
"priority": data.get("priority", "高"),
"tasks": data.get("tasks", ["检查船舶关键项目"]),
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
}
self.db.save(f"plan_{data['ship_id']}", plan)
data["plan"] = plan
return "inspect_ship", data
elif action == "Conduct ship inspection":
result = {
"ship_id": data["ship_id"],
"issue": data.get("issue", "检验不规范"),
"status": "待整改",
"tasks_checked": data["plan"]["tasks"] if "plan" in data else ["检查船舶关键项目"],
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
}
self.db.save(f"check_{data['ship_id']}", result)
return "wait_rectification", result
elif action == "Wait for rectification":
logging.info(f"等待整改: {data['ship_id']}")
return "verify_rectification", data
elif action == "Verify rectification":
current_state = self.db.fetch(f"check_{data['ship_id']}")
if current_state.get("status") == "整改完成":
current_state["status"] = "已验证"
self.db.save(f"check_{data['ship_id']}", current_state)
logging.info(f"整改验证完成: {data['ship_id']}")
return "analyze_feedback", current_state
return "wait_rectification", data
elif action == "Analyze and provide feedback":
all_records = self.db.fetch_all()
issues = [r for r in all_records if "issue" in r and r["status"] != "已验证"]
suggestion = {"suggestion": f"优化流程,未整改问题数: {len(issues)}"}
logging.info(f"分析反馈: {suggestion}")
data["suggestion"] = suggestion
return "complete", data
elif action == "Complete process":
logging.info(f"流程完成: {data['ship_id']}")
return None, data
elif action == "error" or next_step == "unknown":
logging.error(f"未知或错误的操作: {action}")
return None, data
return next_step, data
def run_workflow(self, complaint: str, ship_id: str, ship_type: str):
logging.info("=== 工作流程启动 ===")
current_step = "handle_complaint"
data = {"complaint": complaint, "ship_id": ship_id, "ship_type": ship_type}
history = [] # 记录历史状态
while current_step:
# 获取当前数据库状态
current_state = self.db.fetch(f"check_{ship_id}") or self.db.fetch(f"report_{ship_id}") or {}
data.update(current_state) # 更新数据以反映最新状态
decision = self.call_model(current_step, data, history)
next_step, next_data = self.act(decision, current_step)
# 更新历史记录
history.append({
"step": current_step,
"decision": decision,
"data": next_data,
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
})
data = next_data
if next_step == "wait_rectification":
time.sleep(2) # 模拟整改时间
current_state = self.db.fetch(f"check_{ship_id}")
if current_state:
current_state["status"] = "整改完成"
self.db.save(f"check_{ship_id}", current_state)
logging.info(f"模拟整改完成: {ship_id}")
current_step = next_step
time.sleep(1) # 模拟处理间隔
logging.info("=== 工作流程结束 ===")
# 主系统类
class InspectionSystem:
def __init__(self):
self.db = Database()
self.agent = InspectionAgent(self.db)
def run(self, complaint: str, ship_id: str, ship_type: str):
self.agent.run_workflow(complaint, ship_id, ship_type)
# 测试代码
if __name__ == "__main__":
system = InspectionSystem()
system.run("客船检验不规范", "SHIP123", "客船")
Trae 的贡献
Trae 在代码设计中发挥了关键作用:
-
架构建议:
- 提出了将多智能体整合为单一智能体的想法,简化了系统复杂度。
- 推荐使用 Doubao Pro 1.5 接口,通过提示词驱动决策,避免本地知识库的维护。
-
提示词设计:
- 帮助我编写了清晰的系统提示词,确保模型理解任务并输出结构化结果。
- 例如,要求模型返回
{"action": ..., "data": ...}
的 JSON 格式。
-
流程优化:
- 指导我将工作流程分为明确步骤,并在每个步骤中调用模型,保持逻辑清晰。
- 提供了模拟整改的实现思路,确保流程完整性。
-
代码结构:
- 建议使用 SQLite 数据库记录状态,并设计了
act
方法处理模型返回的各种行动。
- 建议使用 SQLite 数据库记录状态,并设计了
系统运行效果
运行代码后,系统能够自主完成从投诉处理到整改验证的全流程。例如,输入"客船检验不规范"(船舶 ID: SHIP123,类型: 客船),日志输出如下:
css
2025-03-08 12:34:56 - INFO - === 工作流程启动 ===
2025-03-08 12:34:56 - INFO - 模型响应: {"action": "record_complaint", "data": {"complaint": "客船检验不规范", "ship_id": "SHIP123", "ship_type": "客船"}}
2025-03-08 12:34:56 - INFO - 数据保存: report_SHIP123 -> {'complaint': '客船检验不规范', 'ship_id': 'SHIP123', 'ship_type': '客船', 'status': '待检查', 'timestamp': '2025-03-08 12:34:56'}
2025-03-08 12:34:57 - INFO - 模型响应: {"action": "create_plan", "data": {"complaint": "客船检验不规范", "ship_id": "SHIP123", "ship_type": "客船", "status": "待检查", "priority": "高"}}
2025-03-08 12:34:57 - INFO - 数据保存: plan_SHIP123 -> {'ship_type': '客船', 'priority': '高', 'tasks': ['检查船舶关键项目'], 'timestamp': '2025-03-08 12:34:57'}
2025-03-08 12:34:58 - INFO - 模型响应: {"action": "inspect_ship", "data": {"ship_id": "SHIP123", "ship_type": "客船", "plan": {"ship_type": "客船", "priority": "高", "tasks": ["检查船舶关键项目"]}}}
2025-03-08 12:34:58 - INFO - 数据保存: check_SHIP123 -> {'ship_id': 'SHIP123', 'issue': '检验不规范', 'status': '待整改', 'tasks_checked': ['检查船舶关键项目'], 'timestamp': '2025-03-08 12:34:58'}
2025-03-08 12:34:59 - INFO - 等待整改: SHIP123
2025-03-08 12:35:01 - INFO - 数据保存: check_SHIP123 -> {'ship_id': 'SHIP123', 'issue': '检验不规范', 'status': '整改完成', 'tasks_checked': ['检查船舶关键项目'], 'timestamp': '2025-03-08 12:34:58'}
2025-03-08 12:35:01 - INFO - 模拟整改完成: SHIP123
2025-03-08 12:35:02 - INFO - 模型响应: {"action": "finalize", "data": {"ship_id": "SHIP123", "issue": "检验不规范", "status": "整改完成", "tasks_checked": ["检查船舶关键项目"]}}
2025-03-08 12:35:02 - INFO - 数据保存: check_SHIP123 -> {'ship_id': 'SHIP123', 'issue': '检验不规范', 'status': '已验证', 'tasks_checked': ['检查船舶关键项目'], 'timestamp': '2025-03-08 12:34:58'}
2025-03-08 12:35:02 - INFO - 整改验证完成: SHIP123
2025-03-08 12:35:03 - INFO - 模型响应: {"action": "complete", "data": {"ship_id": "SHIP123", "issue": "检验不规范", "status": "已验证"}}
2025-03-08 12:35:03 - INFO - 分析反馈: {'suggestion': '优化流程,未整改问题数: 0'}
2025-03-08 12:35:03 - INFO - === 工作流程结束 ===
可以看到,系统在每次调用 Doubao Pro 1.5 时,根据当前步骤和数据生成了合理的决策,逐步推进了流程。
未来的优化方向
尽管当前系统已经能够自主完成任务,但仍有改进空间:
-
提示词优化:
- 当前提示词较为简单,未来可以加入更多上下文(如法规细则、技术规范),提升模型决策的准确性。
- Trae 建议可以通过 A/B 测试不同提示词,找到最优方案。
-
多任务支持:
- 当前系统一次处理一个投诉,未来可以引入任务队列,支持并发处理多个船舶的监督任务。
-
错误处理:
- 如果模型返回非 JSON 格式或调用失败,当前系统仅记录错误。Trae 推荐添加重试机制或本地备用逻辑。
-
实时交互:
- 增加 API 接口或用户界面,允许动态输入投诉,增强实用性。
-
知识增强:
- 虽然 Doubao Pro 1.5 具备强大的通用知识,但结合本地知识库(如 SQLite 中的历史案例)可能进一步提升专业性。
总结
通过与 Trae 的合作,我成功设计并实现了一个基于火山引擎 Doubao Pro 1.5 接口的船舶检验监督管理系统。这个系统展示了 AI 如何通过指令调用实现自主决策,将复杂的业务流程转化为一个简洁、智能的解决方案。Trae 不仅提供了技术指导,还激发了我对 AI 应用的新思考。
未来,我计划在 Trae 的帮助下进一步优化这个系统,探索更多行业场景的智能化应用。如果你对代码或设计有任何建议,欢迎留言交流!