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>
四、阶段项目成果
(一)功能成果
AI智能轨迹全自动查询:支持任意历史人物姓名输入,调用deepseek自动生成含时间、事件、层级化地名、史料出处、经纬度的标准化轨迹JSON数据,b并通过现有的权威数据库进行位置的校验,无需人工干预。
大规模多人轨迹对比:实现最高20人同时轨迹对比,专属20色调色板区分度高,合并节点保留人物原色,视觉展示清晰直观。
智能化节点合并展示:同地点多事件自动合并,采用区间化标签展示,支持点击弹窗查看完整事件详情,解决节点堆叠混乱问题。
双备份数据持久化:后端数据库保存+本地缓存降级方案,彻底解决查询数据丢失问题,保障数据存储稳定可靠。
(二)技术成果
搭建AI驱动的全自动化轨迹生成闭环,形成从用户输入到可视化输出的标准化业务流程,实现系统从“人工数据录入”到“智能自动生成”的核心升级。
实现AI接口动态参数自适应机制,可根据业务场景自动适配输出长度、随机度与提示词,最大化适配不同业务需求。
完成系统核心缺陷修复,彻底解决轨迹残留、模式冲突、展示异常等关键问题,系统运行稳定性大幅提升。
自研20色人物对比调色板,突破原有5人对比上限,支撑大规模历史人物轨迹比对分析场景。
(三)系统整体成果
本阶段开发完成后,系统完成核心智能化升级,彻底摆脱对预设静态数据的依赖,形成「AI智能生成+精准校对+自动存储+可视化分析」的完整能力体系。结合多人对比、节点智能合并、数据可信度标注等功能,系统已具备基础的历史地理学术研究辅助能力,成功成为古文沉浸式智慧阅读平台的核心功能模块。
五、阶段总结与后续规划
(一)阶段总结
在5月9日至5月28日的实训周期内,我聚焦AI智能化升级核心目标,完成DeepSeek大模型与历史人物轨迹系统的深度融合。通过后端参数动态优化、前端结构化提示词设计、三层坐标校对机制落地,有效保障了AI轨迹数据的准确性与规范性。同时,通过多项体验优化与Bug修复,解决了系统原有卡顿、残留、展示混乱等问题,系统智能化水平、稳定性、可用性均得到显著提升,圆满完成本阶段既定工作目标。
(二)下一步工作计划
专注OCR图像识别功能的开发,选取合适的架构实现图片上传、图像预处理、文字识别、结果展示的完整流程。
