当前位置: 首页 > news >正文

2026 山东大学软件学院项目实训博客 (六):历史人物轨迹系统 DeepSeek 智能查询与坐标校对全流程实现

一、实训时间

2026年5月9日 - 2026年5月28日

二、阶段工作目标

本阶段基于前序已完成的历史地名地图展示、人物轨迹可视化、CHGIS坐标校对等基础功能,核心聚焦DeepSeek AI大模型与历史人物轨迹系统的深度融合。旨在搭建智能化、自动化的轨迹生成与展示体系,实现输入姓名 → AI自动生成轨迹 → 智能坐标校对 → 数据自动保存 → 地图可视化展示的全闭环业务流程。

同时,针对系统现有体验短板,优化多人轨迹对比、同地点节点合并、弹窗交互等核心体验功能,彻底修复轨迹残留、清除不彻底等关键Bug,全方位提升系统智能化程度、运行稳定性与用户交互体验。

核心性能要求:DeepSeek接口响应稳定,轨迹生成与坐标校对综合准确率≥85%,多人对比模式支持最高20人同时比对,页面操作流畅无卡顿、无异常残留。

三、核心工作内容

本阶段开发工作围绕六大核心环节有序推进,分别为DeepSeek接口对接与优化、前端智能查询提示词设计、全流程查询逻辑实现、坐标校对机制完善、多人对比与节点显示优化、系统关键Bug修复,最终落地AI驱动的智能化历史人物轨迹查询核心功能。

(一)DeepSeek 接口对接与后端优化

为适配历史轨迹生成、坐标精准查询、普通对话三种不同业务场景,对Spring Boot后端AIService.java进行定制化改造,实现接口参数动态适配、专用提示词区分、请求超时优化,保障接口响应效率与输出精度。

1. 动态参数自适应调整

针对不同查询需求的特性,动态适配max_tokens(输出文本长度)与temperature(随机度)参数,平衡输出完整性与准确性。轨迹查询需生成海量结构化轨迹数据,因此扩大输出容量、降低随机性;坐标查询追求精准唯一结果,进一步压缩随机度;普通对话适配通用参数,保障响应速度。

// 轨迹查询关键词识别 private static final String[] TRACK_KEYWORDS = { "生平轨迹", "轨迹数据", "输出JSON", "历史学家", "提取人物", "坐标", "经纬度", "coordinate" }; // 动态确定 max_tokens:根据查询类型适配输出长度 private int determineMaxTokens(String message) { if (isTrackQuery(message)) { return 6000; // 轨迹查询需大容量输出,支撑10-30个轨迹点数据生成 } if (isCoordinateQuery(message)) { return 500; // 坐标查询仅需简短结构化JSON结果 } return 2000; // 普通对话通用配置 } // 动态确定 temperature:控制AI输出随机性 private double determineTemperature(String message) { if (isTrackQuery(message)) { return 0.5; // 轨迹查询降低随机度,保障输出格式稳定、内容规范 } if (isCoordinateQuery(message)) { return 0.1; // 坐标查询最小随机度,确保坐标结果唯一精准 } return 0.7; // 普通对话保留适度随机性,提升交互自然度 }

2. 场景化专用系统提示词

为轨迹批量生成、单点坐标查询两大核心场景设计专属系统提示词,明确AI角色定位、输出规范与格式要求,从源头规避格式错乱、内容冗余、坐标考据不严谨等问题。

// 轨迹查询专属提示词 private String getTrackSystemPrompt() { return "你是一位专攻中国历史的资深学者,研究方向涵盖历史人物生平考据、" + "古代行政区划变迁与历史地理信息系统(HGIS)。" + "你的回答必须严格遵循JSON格式规范,每个地点的经纬度坐标需经过严谨考证。" + "对于无法精确定位的坐标,应在coordinate_confidence字段准确标注为medium或low。"; } // 坐标查询专属提示词 private String getCoordinateSystemPrompt() { return "你是一位中国历史地理学专家,专长于古代地名考证与现代坐标转换。" + "你的回答只能包含一个标准JSON对象,格式为:" + "{\"latitude\": 数字, \"longitude\": 数字, \"confidence\": \"high/medium/low\"}。" + "不得输出任何其他文字、解释或标记。"; }

3. 超长请求超时优化

由于历史人物全轨迹生成数据量大、AI计算耗时久,自定义HTTP请求超时参数,避免长耗时查询出现连接中断、请求失败等问题。

// 适配长耗时轨迹查询的超时配置 httpPost.setConfig(RequestConfig.custom() .setConnectTimeout(30000) // 连接超时:30秒 .setSocketTimeout(120000) // 读取超时:120秒,适配大容量数据生成 .setConnectionRequestTimeout(30000) .build());

(二)前端结构化提示词设计

在前端HistoricalMapComplete.vue中设计标准化、高约束性的Prompt模板,明确AI角色、核心任务、输出格式及详细规范,强制AI输出结构化JSON数据,杜绝无效内容,为后续数据解析、校对、可视化提供标准化数据源。

const DEEPSEEK_PROMPT_TEMPLATE = `# 角色定位 你是一位资深的历史学家与历史地理学专家,精通中国历代人物生平考据与古代地名考证。 # 核心任务 提取【{personName}】的完整生平轨迹数据,严格按标准JSON格式输出,不得附加任何解释性文字。 # 输出格式标准 { "人物": "{personName}", "轨迹": [ { "时间": "352年", "event": "事件详细描述,需包含背景、经过与人物状态", "地点": "古代地名(按路/道—府—州—郡—县层级,从大到小书写)", "出处": "据《史料名称》", "coordinates": [经度, 纬度], "coordinate_source": "deepseek", "coordinate_confidence": "high/medium/low" } ] } # 提取规范(必须逐条遵守) 1. **时间规范**:统一使用公元纪年,格式为"XXXX年" 2. **地点规范**:必须采用史料原文中的古代地名,严格按层级格式书写 3. **出处规范**:每个事件须附史料出处 4. **事件规范**:仅收录与人物直接相关的关键节点 5. **经纬度规范**:坐标采用WGS84坐标系,可信度分三级 6. **完整性要求**:尽可能覆盖一生中每一年的事迹 7. **输出限制**:禁止在JSON之外输出任何内容`;

(三)全流程智能查询功能实现

基于前后端协同开发,落地AI轨迹生成→智能坐标校对→数据持久化保存→地图可视化展示四步闭环流程,实现历史人物轨迹全自动智能化生成,无需人工录入数据。

1. AI 自动生成轨迹数据

接收用户输入的历史人物姓名,替换模板提示词后调用DeepSeek接口,兼容多格式接口返回数据,通过正则匹配精准提取结构化JSON轨迹数据,完成初步数据生成。

const generateTrackWithDeepSeek = async (personName: string): Promise<any> => { const prompt = DEEPSEEK_PROMPT_TEMPLATE.replace(/\{personName\}/g, personName); queryLog.value = '正在调用DeepSeek生成轨迹数据...'; const res = await sendChatMessage({ model: AI_MODELS.DEEPSEEK, message: prompt, history: [] }); // 多维度兼容解析接口返回数据 let content = ''; if (res?.data) { if (typeof res.data === 'string') content = res.data; else if (res.data.choices?.[0]?.message?.content) content = res.data.choices[0].message.content; else if (res.data.content) content = res.data.content; } // 正则精准提取JSON核心数据 const jsonMatch = content.match(/\{[\s\S]*\}/); let trackData = JSON.parse(jsonMatch[0]); return trackData; };

2. 三层智能坐标校对与数据清洗

为解决AI生成坐标存在偏差、老旧地名定位不准的问题,设计特殊地点映射优先、本地地名库匹配为辅、AI兜底重查的三层校对机制,大幅提升坐标准确率。

const correctCoordinates = async (trackData: any): Promise<any> => { queryLog.value = '正在校对坐标...'; const correctedTracks = []; let foundCount = 0, aiCount = 0; for (const point of trackData.轨迹) { const location = point.地点 || point.location; const time = point.时间 || point.time; // 优先级1:系统预设特殊地点精准映射 const found = findPlaceByName(location); if (found) { correctedTracks.push({ ...point, coordinates: found.coordinates, coordinate_source: found.source, coordinate_confidence: found.confidence }); foundCount++; continue; } // 优先级2:保留AI生成的有效合规坐标 if (point.coordinates && isValidCoordinate(point.coordinates)) { correctedTracks.push({ ...point, coordinate_source: 'deepseek', coordinate_confidence: point.coordinate_confidence || 'medium' }); aiCount++; continue; } // 优先级3:无有效坐标时AI兜底重新查询校对 const aiCoords = await queryCoordinatesByAI(location, time); // 兜底数据填充逻辑 } queryLog.value = `校对完成:地名库匹配${foundCount}个,AI查询${aiCount}个`; return { ...trackData, 轨迹: correctedTracks }; };

3. 双策略数据持久化保存

采用「后端接口优先、本地存储降级」的双备份策略,规避后端接口异常导致的数据丢失问题,保障轨迹数据100%留存。

// 优先保存到后端数据库,失败则自动降级保存至本地 try { await savePersonTrackData(correctedData); queryLog.value = '步骤3/4: 轨迹数据已保存'; } catch { queryLog.value = '步骤3/4: 保存到后端失败,已保存到本地'; saveTrackToLocal(correctedData); }

4. 数据自动可视化渲染

对校对后的标准化轨迹数据进行格式适配,统一字段规范,自动添加至人物轨迹列表,触发地图渲染,完成轨迹线条、标记点的可视化展示。

// 标准化轨迹数据格式,适配地图渲染要求 const points: TrackPoint[] = correctedData.轨迹.map((p: any) => ({ time: p.时间 || p.time || '', event: p.event || p.事件 || '', location: p.地点 || p.location || '', coordinates: p.coordinates || null, year: parseYear(p.时间 || p.time || ''), source: p.出处 || p.source || '', coordinate_source: p.coordinate_source || 'deepseek', coordinate_confidence: p.coordinate_confidence || 'medium' })); // 自动更新列表并渲染轨迹 personTracks.value.push({ name: correctedData.人物, points }); selectedPerson.value = correctedData.人物; drawPersonTrack(correctedData.人物);

(四)多人对比模式全方位优化

针对原有多人对比人数上限低、节点颜色混乱、展示不直观等问题,完成调色板扩容、节点颜色适配、合并标签优化等升级,支撑大规模人物轨迹比对场景。

1. 20色独立调色板扩容

将原有5色对比调色板扩容至20色,支持最多20人同时轨迹对比,保障每个人物轨迹颜色唯一、区分度高,避免视觉混淆。

// 20色专属对比调色板,适配20人同时比对 const personColorPalette = [ '#4caf50', '#2196f3', '#e91e63', '#9c27b0', '#00bcd4', // 基础5色 '#ff5722', '#795548', '#607d8b', '#8bc34a', '#ffc107', // 新增5色 '#03a9f4', '#f44336', '#673ab7', '#009688', '#cddc39', // 新增5色 '#e91e63', '#3f51b5', '#ff9800', '#00bcd4', '#9e9e9e' // 新增5色 ]; // 人数上限校验:最大支持20人同时对比 if (selectedPersons.value.length >= 20) { ElMessage.warning('最多同时对比20人'); return; }

2. 合并节点颜色适配修复

修复同地点多事件合并后节点统一变为橙色、无法区分人物的问题,让合并节点始终保留对应人物专属颜色,保持视觉一致性。

// 修改前:所有合并节点统一橙色,无法区分人物 const markerColor = isMerged ? '#ff6b00' : color; // 修改后:合并节点继承人物原有颜色,辨识度拉满 const markerColor = color;

3. 智能节点合并标签优化

优化同地点多轨迹节点的合并展示逻辑,摒弃原有重新编号的方式,采用「连续区间+离散节点」组合式标签展示(如节点1-3、5),精准对应原始轨迹节点,信息展示更直观。

const mergedTrackGroups = computed(() => { // 按地点分组归集所有轨迹节点 const locationMap = new Map<string, number[]>(); points.forEach((point, index) => { const loc = (point.location || '未知地点').trim(); if (!locationMap.has(loc)) locationMap.set(loc, []); locationMap.get(loc)!.push(index); }); // 智能生成区间化节点标签 locationMap.forEach((indexes, location) => { const ranges: string[] = []; let start = indexes[0], end = indexes[0]; for (let i = 1; i < indexes.length; i++) { if (indexes[i] === end + 1) { end = indexes[i]; } else { ranges.push(start === end ? `${start + 1}` : `${start + 1}-${end + 1}`); start = indexes[i]; end = indexes[i]; } } ranges.push(start === end ? `${start + 1}` : `${start + 1}-${end + 1}`); label = ranges.join('、'); }); });

(五)核心 Bug 专项修复

针对系统测试过程中发现的轨迹残留、模式冲突、弹窗缺失等关键问题,逐一定位根因、针对性修复,大幅提升系统稳定性。

Bug1:多人对比轨迹清除不彻底

问题描述:取消多人对比中的某个人物后,对应的轨迹线、标记点仍残留在地图表层,无法自动清除,造成图层混乱。

根因分析:原有清除逻辑仅处理可视化图层,未清空personTrackDataMap中缓存的人物轨迹数据,缓存残留导致界面元素无法彻底销毁。

修复方案:新增Map缓存数据清空逻辑,逐层解绑地图图层、移除标记、清空缓存数组,彻底清除残留数据。

const clearComparePersonTrack = (personName: string) => { const data = personTrackDataMap.value.get(personName); if (data) { // 1. 解绑并清除轨迹线图层 if (data.trackLine && map) { data.trackLine.setMap(null); map.remove(data.trackLine); } // 2. 反向遍历清除所有标记点,避免索引错乱 for (let i = data.trackMarkers.length - 1; i >= 0; i--) { const m = data.trackMarkers[i]; if (m && map) { m.setMap(null); map.remove(m); } } // 3. 清空缓存数组、删除Map缓存数据 data.trackMarkers.length = 0; personTrackDataMap.value.delete(personName); } };

Bug2:人物切换时对比模式残留

问题描述:开启多人对比模式后,直接切换单个人物查询,对比模式状态不自动关闭,导致新轨迹渲染异常。

修复方案:在人物选择函数中新增模式检测逻辑,切换单人查询时自动关闭对比模式、清空对比列表。

const selectPerson = (name: string) => { // 切换单人视图自动关闭多人对比模式,清除残留状态 if (compareMode.value) { compareMode.value = false; selectedPersons.value = []; } // 后续单人轨迹渲染逻辑 };

Bug3:合并对比节点详情弹窗缺失

问题描述:多人对比模式下,同地点合并节点无详情弹窗,无法查看对应历史事件、时间等详细信息。

修复方案:新增合并节点专属弹窗组件,展示地点名称、事件次数、各节点详情,支持单点事件精准查看。

<el-dialog v-model="mergedCompareDetailVisible" :title="'📍 ' + selectedMergedComparePerson + ' · 节点' + (selectedMergedCompareGroup?.label || '')" :width="popupWidth"> <div v-if="selectedMergedCompareGroup" class="merged-container"> <div class="merged-places-header"> <div class="merged-location-name"> 📍 {{ selectedMergedCompareGroup.location || '未知地点' }} </div> <div class="merged-count-info"> 该地点在轨迹中共出现 {{ selectedMergedCompareGroup.indexes.length }} 次 </div> </div> <div class="merged-places-list"> <div v-for="(point, idx) in selectedMergedCompareGroup.points" :key="idx" class="merged-place-card" @click="showComparePointDetail(...)"> <div class="place-index">节点 {{ selectedMergedCompareGroup.indexes[idx] + 1 }}</div> <div class="place-time">📅 {{ formatTrackTime(point) }}</div> <div class="place-event">{{ cleanText(point.event) || '暂无事件描述' }}</div> </div> </div> </div> </el-dialog>

(六)用户体验细节优化

围绕查询可视化、操作便捷性、数据透明性三大维度优化交互细节,降低用户操作门槛,提升系统易用性。

1. 全流程进度可视化展示

接入步骤进度条组件,实时展示「AI生成轨迹-坐标校对-数据保存-可视化展示」四大流程状态,让用户清晰掌握查询进度。

<el-steps :active="queryStep" align-center> <el-step title="AI生成轨迹" /> <el-step title="坐标校对" /> <el-step title="数据保存" /> <el-step title="可视化展示" /> </el-steps>

2. 高频人物快捷查询

预设李白、杜甫、苏轼等高频历史人物快捷按钮,支持一键触发轨迹查询,无需手动输入,提升操作效率。

// 高频历史人物快捷查询列表 const quickPersons = ['李白', '杜甫', '苏轼', '辛弃疾', '岳飞', '魏征'];

3. 坐标可信度可视化标注

为每个轨迹点新增可信度颜色标签与数据来源标注,绿色代表高精准、橙色代表中等精准、红色代表低精准,让数据精度透明可视化。

<el-tag :type="confidenceTagType(selectedPoint.coordinate_confidence)" size="small"> {{ selectedPoint.coordinate_confidence }} </el-tag> <span class="confidence-source" v-if="selectedPoint.coordinate_source"> 来源: {{ selectedPoint.coordinate_source }} </span>

四、阶段项目成果

(一)功能成果

  1. AI智能轨迹全自动查询:支持任意历史人物姓名输入,调用deepseek自动生成含时间、事件、层级化地名、史料出处、经纬度的标准化轨迹JSON数据,b并通过现有的权威数据库进行位置的校验,无需人工干预。

  2. 大规模多人轨迹对比:实现最高20人同时轨迹对比,专属20色调色板区分度高,合并节点保留人物原色,视觉展示清晰直观。

  3. 智能化节点合并展示:同地点多事件自动合并,采用区间化标签展示,支持点击弹窗查看完整事件详情,解决节点堆叠混乱问题。

  4. 双备份数据持久化:后端数据库保存+本地缓存降级方案,彻底解决查询数据丢失问题,保障数据存储稳定可靠。

(二)技术成果

  1. 搭建AI驱动的全自动化轨迹生成闭环,形成从用户输入到可视化输出的标准化业务流程,实现系统从“人工数据录入”到“智能自动生成”的核心升级。

  2. 实现AI接口动态参数自适应机制,可根据业务场景自动适配输出长度、随机度与提示词,最大化适配不同业务需求。

  3. 完成系统核心缺陷修复,彻底解决轨迹残留、模式冲突、展示异常等关键问题,系统运行稳定性大幅提升。

  4. 自研20色人物对比调色板,突破原有5人对比上限,支撑大规模历史人物轨迹比对分析场景。

(三)系统整体成果

本阶段开发完成后,系统完成核心智能化升级,彻底摆脱对预设静态数据的依赖,形成「AI智能生成+精准校对+自动存储+可视化分析」的完整能力体系。结合多人对比、节点智能合并、数据可信度标注等功能,系统已具备基础的历史地理学术研究辅助能力,成功成为古文沉浸式智慧阅读平台的核心功能模块。

五、阶段总结与后续规划

(一)阶段总结

在5月9日至5月28日的实训周期内,我聚焦AI智能化升级核心目标,完成DeepSeek大模型与历史人物轨迹系统的深度融合。通过后端参数动态优化、前端结构化提示词设计、三层坐标校对机制落地,有效保障了AI轨迹数据的准确性与规范性。同时,通过多项体验优化与Bug修复,解决了系统原有卡顿、残留、展示混乱等问题,系统智能化水平、稳定性、可用性均得到显著提升,圆满完成本阶段既定工作目标。

(二)下一步工作计划

专注OCR图像识别功能的开发,选取合适的架构实现图片上传、图像预处理、文字识别、结果展示的完整流程。

http://www.jsqmd.com/news/928277/

相关文章:

  • 深度学习与神经网络学习笔记 —— Transformer模型原理与实现
  • 2026年最新三明市金银首饰回收+金条金币+铂金K金 高价回收;实体老店回收黄金 多年口碑 交易放心;TOP5实力权威排行榜推荐+联系方式 - 亦辰小黄鸭
  • 怎么选择一款合适的电磁冷热量表?哪些厂家值得信赖? - 仪表人小余
  • 【C++】vector的模拟实现
  • 无感通关 智守国门 黎阳之光赋能海关口岸监管升级
  • Kubernetes与机器学习推理服务最佳实践
  • 深度学习框架 基于 YOLOv8 的道路裂缝检测系统
  • 群面系统中五维能力评估的实现
  • AI赋能人力资源管理:从预测分析到个性化发展的实践指南
  • 【infra之路】阶段二 · 模块二:CUDA 编程入门(上)— 基本功与向量加法
  • 哈工大神经网络与深度学习第三次总结
  • 2iterable iterator 可迭代对象与迭代器
  • 如何让 AI 读懂你的奇葩需求?针对 Gemini 3.5 优化的 Prompt 进阶指南
  • 鸿蒙原生开发生态全景:从 ArkTS 到纯血鸿蒙
  • mydumper 编译安装与 RPM 部署:从源码到实战的避坑指南
  • 中国建设银行广东茂名分行:警惕AI诈骗的陷阱
  • 跨国链路的物理限制:马蒂斯公式(Mathis‘s Formula)
  • 人形检测数据集, 目标检测/行人检测/安防AI模型训练 密集场景人形检测数据集 / 行人检测数据集训练及应用
  • Protobuf协议解析与微信数据结构设计
  • 开发日志六
  • 对波普尔可证伪主义引发全域系统性灾难的全面批判
  • 百度SEO优化实战指南:2026年百度SEO优化核心技巧全面解析
  • STM32 SAI 通讯原理与 TDM 应用
  • 第四章:暗礁
  • 【个人记账理财助手】手动新增账单功能
  • 2026年最新三亚市金银首饰回收+金条金币+铂金K金 高价回收;实体老店回收黄金 多年口碑 交易放心;TOP5实力权威排行榜推荐+联系方式 - 亦辰小黄鸭
  • 2026最新指南|Codex 接入 MiniMax 模型全攻略:利用 CC Switch 本地路由零基础配置
  • 从一次线上GC故障排查说起:我为什么最终把生产环境从OracleJDK 11换成了Amazon Corretto 11
  • 医疗营销实战:生成式AI在聊天机器人、内容创作与社交媒体中的应用
  • 第1篇 | 政治思维生存逻辑解析