[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-93324":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":12,"openIssues":13,"contributorsCount":13,"subscribersCount":13,"size":13,"stars1d":13,"stars7d":14,"stars30d":14,"stars90d":13,"forks30d":13,"starsTrendScore":13,"compositeScore":15,"rankGlobal":9,"rankLanguage":9,"license":9,"archived":16,"fork":16,"defaultBranch":17,"hasWiki":16,"hasPages":16,"topics":18,"createdAt":9,"pushedAt":9,"updatedAt":28,"readmeContent":29,"aiSummary":30,"trendingCount":13,"starSnapshotCount":13,"syncStatus":12,"lastSyncTime":31,"discoverSource":32},93324,"Guido","youxiandechilun\u002FGuido","youxiandechilun","景区导览服务 AI 数字人：基于 Spring Boot、Vue 3、UniApp 与本地 RAG 的智能导览系统。",null,"Java",105,2,0,3,40.23,false,"main",[19,20,21,22,23,24,25,26,27],"ai","digital-human","java","mysql","rag","spring-boot","sse","uniapp","vue3","2026-07-22 04:02:08","# 景区导览服务 AI 数字人\n\n面向景区游客与运营人员的一体化智能导览系统。项目将文本问答、语音交互、拍照识景、本地 RAG、个性化路线推荐和游客行为分析整合到同一业务中，并提供 UniApp 游客端、Vue 3 管理后台与 Spring Boot 后端服务。\n\n| 项目信息 | 内容 |\n| --- | --- |\n| 项目角色 | 项目负责人 \u002F 全栈与 AI 应用开发 |\n| 主要职责 | 系统设计、数据库建模、后端开发、AI 服务集成、游客端与管理后台实现 |\n| GitHub | [github.com\u002Fyouxiandechilun\u002FGuido](https:\u002F\u002Fgithub.com\u002Fyouxiandechilun\u002FGuido) |\n\n## 项目价值\n\n- **面向游客：** 将分散的景区资料转换为可追溯的智能问答，支持文字、语音和图片输入，并根据兴趣推荐游览路线。\n- **面向运营人员：** 统一维护景区、景点、路线、知识资料、模型配置与数字导游形象，通过数据看板了解高频问题、热门景点和游客情绪。\n- **面向工程落地：** 使用模型协议适配层隔离厂商差异，通过本地知识检索、SSE 流式输出、凭据加密和调用日志保证核心链路可维护、可降级、可排查。\n\n## 个人职责\n\n- 负责项目整体方案、数据库模型和后端模块设计，基于 Java 17 与 Spring Boot 3.2.5 提供 RESTful API、统一响应、参数校验、异常处理和双账号鉴权。\n- 设计“文本\u002F语音输入 -> 本地 RAG 检索 -> 大模型生成 -> 语音合成 -> Canvas 数字导游播报”的交互链路，并接入图片识别能力。\n- 建设景区本地 RAG 知识库，实现文本资料入库、重叠分片、Embedding 向量化、MySQL 持久化、余弦相似度 Top-K 召回、关键词降级检索和引用溯源。\n- 封装 LLM、VLM、Embedding、ASR 与 TTS 服务适配层，支持动态配置、协议路由、连通性测试、超时控制、凭据加密与调用日志。\n- 实现兴趣驱动的路线推荐，输出推荐理由、预计时长和有序景点列表；建设对话、反馈、情绪和知识库命中数据的运营分析能力。\n- 完成游客端与管理后台的主要业务界面和接口联调，覆盖导览问答、识景、路线、知识库、模型配置、运营看板和报告导出。\n\n## 核心功能\n\n| 模块 | 主要能力 |\n| --- | --- |\n| 多模态导览 | 文本问答、语音问答、拍照识景、上下文会话与资料引用 |\n| 本地 RAG | 文档管理、重叠分片、向量化、Top-K 检索、关键词兜底与检索测试 |\n| 流式响应 | SSE 增量文本、识别结果、引用来源、情绪、音频地址和阶段耗时 |\n| 个性化路线 | 兴趣标签匹配、路线加权排序、预计时长、推荐理由与景点顺序 |\n| 数字导游 | 形象选择、音色与语速配置、TTS 播报和 Canvas 状态动画 |\n| AI 服务管理 | LLM、VLM、Embedding、ASR、TTS 配置、能力测试与默认服务切换 |\n| 运营分析 | 热门问题、热门景点、情绪分布、知识库命中率、耗时趋势与 Word 报告 |\n| 后台管理 | 景区、景点、路线、知识库、游客、反馈、会话、日志和数据大屏 |\n\n## 智能交互链路\n\n```mermaid\nsequenceDiagram\n    participant U as 游客\n    participant C as 游客端\n    participant B as 导览后端\n    participant R as 本地 RAG\n    participant M as 模型适配层\n    participant S as 语音服务\n\n    U->>C: 输入文字或录制语音\n    alt 语音输入\n        C->>B: 上传音频\n        B->>S: ASR 语音识别\n        S-->>B: 返回识别文本\n        B-->>C: SSE asr 事件\n    else 文本输入\n        C->>B: 提交问题\n    end\n\n    B->>R: 按景区检索知识\n    R->>M: 生成问题向量\n    M-->>R: 返回 Embedding\n    R-->>B: 上下文与引用来源\n    B->>M: 提交问题、上下文与情绪提示\n    M-->>B: 增量回答\n    B-->>C: SSE delta 事件\n    B->>S: TTS 语音合成\n    S-->>B: 返回音频地址\n    B-->>C: sources \u002F emotion \u002F audio \u002F done\n    C->>C: 播放语音并驱动 Canvas 形象\n```\n\n图片输入通过 VLM 完成景点识别，再结合本地景点资料和知识库生成导览内容。\n\n## 核心实现\n\n### 本地 RAG 知识库\n\n知识库由应用自行管理文档、文本分块和向量，不依赖外部托管知识库平台。\n\n1. 上传文本资料后保存文档元数据，并按目标长度 `500`、重叠长度 `50` 生成分块。\n2. 通过 OpenAI-Compatible Embedding 接口生成向量，以 JSON 数组形式写入 MySQL `kb_chunk.embedding` 字段。\n3. 查询时生成问题向量，在应用层计算余弦相似度，默认召回 Top 3，并过滤低于 `0.5` 的结果。\n4. Embedding 服务不可用或向量未命中时，自动降级为关键词检索，避免知识问答完全不可用。\n5. 命中分块被组合为长度受控的上下文，同时返回来源名称、标题路径、内容摘要与相似度分数。\n\n关键实现：[KnowledgeServiceImpl](backend\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fguido\u002Fscenicai\u002Fmodule\u002Fknowledge\u002Fservice\u002Fimpl\u002FKnowledgeServiceImpl.java) \u002F [LocalRagService](backend\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fguido\u002Fscenicai\u002Fmodule\u002Fknowledge\u002Fservice\u002FLocalRagService.java)\n\n### SSE 流式问答\n\n- 文本与语音问答同时提供普通响应和 SSE 流式接口。\n- 后端使用 `SseEmitter` 建立 60 秒连接，在异步任务中完成检索、模型生成、TTS 与消息持久化。\n- LLM 适配器将上游流式内容转换为统一 `delta` 事件，游客端可以边接收边渲染。\n- 语音链路分别记录 ASR、检索、LLM 与 TTS 阶段耗时，便于定位外部服务延迟。\n\n| SSE 事件 | 内容 |\n| --- | --- |\n| `asr` | 语音识别文本，仅语音问答返回 |\n| `meta` | 会话编号与消息 ID |\n| `delta` | 模型增量回答 |\n| `sources` | 知识库命中状态与引用来源 |\n| `emotion` | 正向、中性、负向或投诉情绪 |\n| `audio` | TTS 音频地址 |\n| `done` | 总耗时、执行状态与阶段耗时 |\n\n关键实现：[TouristTextStreamService](backend\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fguido\u002Fscenicai\u002Fmodule\u002Fchat\u002Fservice\u002Fimpl\u002FTouristTextStreamService.java) \u002F [TouristVoiceStreamService](backend\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fguido\u002Fscenicai\u002Fmodule\u002Fchat\u002Fservice\u002Fimpl\u002FTouristVoiceStreamService.java)\n\n### 模型与语音服务适配\n\n- LLM 与 VLM 通过路由层选择 OpenAI-Compatible 或 Anthropic-Compatible 适配器，业务层不直接依赖具体厂商。\n- Embedding 客户端统一处理文本向量化，供知识入库和问题检索复用。\n- 管理后台可以维护服务类型、协议、Base URL、模型名称、超时时间及鉴权信息，并执行连通性测试。\n- AI 服务凭据使用 AES-GCM 加密后入库，接口返回时只展示脱敏结果。\n- 阿里云 ASR\u002FTTS 调用失败时记录错误与耗时；TTS 失败不会阻断文字回答。\n\n关键实现：[LlmClientRouter](backend\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fguido\u002Fscenicai\u002Fintegration\u002Fllm\u002FLlmClientRouter.java) \u002F [CredentialCrypto](backend\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fguido\u002Fscenicai\u002Fcommon\u002Fsecurity\u002FCredentialCrypto.java)\n\n### 个性化路线推荐\n\n- 优先使用请求中的兴趣描述，未传入时读取游客资料中的 `interestTags`。\n- 按路线兴趣标签、适合人群、名称和简介分别计算匹配分，并叠加路线类型匹配分。\n- 得分倒序返回最多 5 条路线，同时查询路线景点关联表，按 `sortOrder` 返回景点顺序。\n- 返回结果包含推荐理由、预计游览时长和结构化景点列表，便于游客端直接展示。\n\n关键实现：[TouristRouteRecommendServiceImpl](backend\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fguido\u002Fscenicai\u002Fmodule\u002Fchat\u002Fservice\u002Fimpl\u002FTouristRouteRecommendServiceImpl.java)\n\n### 游客行为分析\n\n- 对游客问题、模型回答和反馈内容进行正向、中性、负向、投诉四类情绪识别。\n- 汇总服务次数、输入类型、平均响应耗时、知识库命中率、热门问题和热门景点。\n- 每日定时生成统计数据，并为管理后台提供最近 7 天服务量与知识库命中率趋势。\n- 支持按日期生成游客感受度报告，并导出 Word 文档。\n\n关键实现：[DashboardServiceImpl](backend\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fguido\u002Fscenicai\u002Fmodule\u002Fdashboard\u002Fservice\u002Fimpl\u002FDashboardServiceImpl.java) \u002F [SentimentReportServiceImpl](backend\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fguido\u002Fscenicai\u002Fmodule\u002Fsentiment\u002Fservice\u002Fimpl\u002FSentimentReportServiceImpl.java)\n\n## 技术栈\n\n| 领域 | 技术 |\n| --- | --- |\n| 后端 | Java 17、Spring Boot 3.2.5、Maven |\n| 数据访问 | MyBatis-Plus 3.5.5、MySQL 8 |\n| 接口与鉴权 | RESTful API、SSE、Sa-Token 1.38.0、Bean Validation |\n| AI 能力 | OpenAI-Compatible、Anthropic-Compatible、Embedding、VLM、本地 RAG |\n| 语音能力 | 阿里云 ASR、阿里云 TTS |\n| 后端工程 | Spring AOP、BCrypt、AES-GCM、Knife4j 4.5.0 |\n| 管理后台 | Vue 3.4、TypeScript 5.4、Vite 5.2、Element Plus 2.7、Pinia、ECharts 5.5 |\n| 游客端 | UniApp、Vue 3、TypeScript、Fetch Stream \u002F SSE |\n\n## 系统模块\n\n| 端 | 主要能力 |\n| --- | --- |\n| 游客端 | 注册登录、景区首页、景点详情、数字导游选择、文本\u002F语音问答、拍照识景、路线推荐、会话历史与反馈 |\n| 管理后台 | 景区、景点、路线、知识库、AI 配置、数字导游、游客、对话、反馈、报告、日志与数据大屏管理 |\n| 后端服务 | 双账号鉴权、业务 API、模型协议路由、本地 RAG、SSE 编排、ASR\u002FTTS、文件服务、统计任务与审计日志 |\n| 数据层 | 用户、景区、景点、路线、知识文档、文本分块、会话、消息、反馈、AI 配置、报告与每日统计 |\n\n## 主要 API\n\n| 方法 | 路径 | 说明 |\n| --- | --- | --- |\n| `POST` | `\u002Fapi\u002Ftourist\u002Fchat\u002Ftext` | 文本问答 |\n| `POST` | `\u002Fapi\u002Ftourist\u002Fchat\u002Ftext\u002Fstream` | 文本问答 SSE |\n| `POST` | `\u002Fapi\u002Ftourist\u002Fchat\u002Fvoice` | 语音问答 |\n| `POST` | `\u002Fapi\u002Ftourist\u002Fchat\u002Fvoice\u002Fstream` | 语音问答 SSE |\n| `POST` | `\u002Fapi\u002Ftourist\u002Fvision\u002Frecognize` | 拍照识别景点并生成讲解 |\n| `GET` | `\u002Fapi\u002Ftourist\u002Froute\u002Frecommend` | 个性化路线推荐 |\n| `POST` | `\u002Fapi\u002Fadmin\u002Fknowledge\u002Fupload` | 上传知识资料 |\n| `POST` | `\u002Fapi\u002Fadmin\u002Fknowledge\u002Fsync\u002F{id}` | 文档切片与向量化 |\n| `POST` | `\u002Fapi\u002Fadmin\u002Fknowledge\u002Ftest` | 测试知识检索 |\n| `GET` | `\u002Fapi\u002Fadmin\u002Fdashboard\u002Foverview` | 获取运营概览 |\n| `POST` | `\u002Fapi\u002Fadmin\u002Fsentiment\u002Fgenerate` | 生成游客感受度报告 |\n| `POST` | `\u002Fapi\u002Fadmin\u002Fsentiment\u002Fgenerate-docx` | 导出 Word 报告 |\n\n完整参数与返回结构可在后端启动后访问 `http:\u002F\u002Flocalhost:8080\u002Fdoc.html`。\n\n## 项目结构\n\n```text\nGuido\u002F\n├── backend\u002F\n│   └── src\u002Fmain\u002Fjava\u002Fcom\u002Fguido\u002Fscenicai\u002F\n│       ├── common\u002F          统一响应、异常、鉴权、加密与操作日志\n│       ├── integration\u002F     LLM、VLM、Embedding、ASR、TTS 适配层\n│       ├── module\u002F          景区、景点、路线、知识库、对话等业务模块\n│       └── job\u002F             每日统计任务\n├── admin-web\u002F               Vue 3 管理后台\n├── tourist-app\u002F             UniApp 游客端\n├── database\u002F                数据库结构与初始化数据\n├── assets\u002F                  知识资料与数字导游资源\n└── docs\u002F                    接口、数据库与部署文档\n```\n\n## 快速开始\n\n### 环境要求\n\n| 工具 | 版本 |\n| --- | --- |\n| JDK | 17 |\n| Maven | 3.9.x |\n| MySQL | 8.x |\n| Node.js | 20.11.1 |\n| pnpm | 8.15.4 |\n| 游客端工具 | HBuilderX |\n\n### 初始化数据库\n\n`schema.sql` 会自动创建并选择 `scenic_ai_guide` 数据库：\n\n```bash\nmysql --default-character-set=utf8mb4 -u root -p \u003C database\u002Fschema.sql\nmysql --default-character-set=utf8mb4 -u root -p \u003C database\u002Fdata.sql\n```\n\n### 启动后端\n\nPowerShell：\n\n```powershell\ncd backend\n$env:DB_PASSWORD = Read-Host '请输入 MySQL 密码'\n$env:AI_CONFIG_AES_KEY = Read-Host '请输入至少 32 位的本地加密密钥'\nmvn spring-boot:run\n```\n\n- 后端地址：`http:\u002F\u002Flocalhost:8080`\n- Knife4j 文档：`http:\u002F\u002Flocalhost:8080\u002Fdoc.html`\n\n### 启动管理后台\n\n```powershell\ncd admin-web\ncorepack pnpm install --frozen-lockfile\n$env:VITE_API_BASE_URL = 'http:\u002F\u002Flocalhost:8080\u002Fapi'\ncorepack pnpm exec vite\n```\n\n管理后台默认地址为 `http:\u002F\u002Flocalhost:5173`。\n\n### 启动游客端\n\n1. 使用 HBuilderX 打开 `tourist-app`。\n2. 运行到浏览器、模拟器或 Android 真机。\n3. 真机调试时，将 API 地址配置为电脑的局域网后端地址。\n\n## 安全设计\n\n- 管理员与游客使用独立的 Sa-Token 登录逻辑，避免账号体系混用。\n- 用户密码使用 BCrypt 单向哈希保存，手机号等敏感信息在接口层脱敏。\n- AI 服务的 API Key、AccessKeyId 和 AccessKeySecret 使用 AES-GCM 加密后入库。\n- `.env`、本地与生产配置、运行日志、上传文件和构建产物均已加入 `.gitignore`。\n- 仓库不包含真实第三方服务凭据；部署时必须设置独立数据库密码和稳定的 `AI_CONFIG_AES_KEY`。\n- `database\u002Fdata.sql` 仅用于本地演示初始化，部署到公开环境前应替换其中的示例账号。\n\n## 构建检查\n\n```powershell\ncd backend\nmvn test\n\ncd ..\u002Fadmin-web\ncorepack pnpm install --frozen-lockfile\ncorepack pnpm run build\n```\n\n更多说明见 [项目文档索引](docs\u002FREADME.md)。\n","这是一个面向旅游景区的AI数字人导览系统，提供多模态智能导览服务。核心功能包括文本\u002F语音\u002F图像输入的问答交互、基于本地RAG的知识检索（支持文档分片、向量化存储与余弦相似度召回）、SSE流式响应、兴趣驱动的个性化路线推荐、Canvas驱动的数字导游形象播报，以及面向运营人员的知识库管理与数据看板。技术上采用Spring Boot+Vue 3+UniApp全栈架构，RAG知识库本地化部署于MySQL，具备模型协议适配层和降级机制，保障服务可维护性与稳定性。适用于5A\u002F4A景区、文旅综合体及博物馆等需要自主可控、低延迟、多终端协同的智慧导览场景。","2026-07-16 02:30:07","CREATED_QUERY"]