个人AI应用开发项目系统性代码总结


1. 项目概述

        本项目是一个完整的AI应用开发学习项目,包含AI应用开发练习demo和"小智AI"医疗挂号客服项目两个核心部分。通过这个项目,我深入学习了LangChain4j框架的应用,掌握了从基础的AI对话到复杂的医疗客服系统的完整开发流程。

1.2 项目目标


- 掌握LangChain4j框架的核心概念和应用
- 实现不同类型的AI助手(简单对话、记忆对话、工具调用)
- 构建完整的医疗挂号客服系统
- 理解RAG(检索增强生成)的实际应用
- 掌握前后端一体化开发流程


2. 项目整体架构

层级 技术/框架 版本 用途
后端框架 Spring Boot 3.2.6 应用框架
AI框架 LangChain4j 1.0.0-beta3 AI能力集成
开发语言 Java 17 核心开发语言
记忆存储 MongoDB 本地 聊天记忆
业务数据 MySQL 本地 预约业务数据
AI模型 DeepSeek
AI模型 阿里百炼 中文模型支持
AI模型 Ollama

项目结构
java-ai-langchain4j/
├── src/main/java/com/atguigu/java/ai/langchain4j/
│   ├── XiaozhiApp.java                    # 主启动类
│   ├── assistant/                         # AI助手接口
│   │   ├── XiaozhiAgent.java             # 医疗挂号客服助手
│   │   ├── MemoryChatAssistant.java       # 带记忆的聊天助手
│   │   ├── SeparateChatAssistant.java     # 区分会话的助手
│   │   └── Assistant.java                 # 基础助手
│   ├── config/                           # 配置类
│   │   ├── XiaozhiAgentConfig.java       # 小智配置
│   │   ├── MemoryChatAssistantConfig.java # 记忆助手配置
│   │   ├── SeparateChatAssistantConfig.java # 区分会话配置
│   │   └── CorsConfig.java               # 跨域配置
│   ├── Controller/                       # 控制器
│   │   └── XiaozhiController.java        # 小智控制器
│   ├── Service/                          # 业务服务
│   │   ├── AppointmentService.java       # 预约服务接口
│   │   └── impl/AppointmentServiceImpl.java # 预约服务实现
│   ├── Tools/                            # AI工具
│   │   ├── AppointmentTools.java          # 预约工具
│   │   └── CalculatorTools.java          # 计算器工具
│   ├── entity/                           # 实体类
│   │   └── Appointment.java              # 预约实体
│   ├── mapper/                           # 数据访问层
│   │   └── AppointmentMapper.java        # 预约映射器
│   ├── Store/                            # 存储实现
│   │   └── MongoChatMemoryStore.java    # MongoDB记忆存储
│   └── bean/                             # 数据传输对象
│       ├── ChatForm.java                 # 聊天表单
│       └── ChatMessages.java             # 聊天消息
├── src/main/resources/
│   ├── application.properties             # 应用配置
│   ├── zhaozhi-prompt-template.txt       # 小智提示词模板
│   ├── my-prompt-template.txt            # 基础提示词模板
│   └── my-prompt-template3.txt          # 扩展提示词模板
└── src/test/java/                       # 测试类
    ├── LLMTest.java                     # 大模型测试
    ├── RAGTest.java                     # RAG测试
    ├── ToolsTest.java                   # 工具测试
    ├── EmbeddingTest.java               # 嵌入测试
    └── ...                              # 其他测试类

frontend/                                # 前端项目
├── src/
│   ├── App.vue                          # 主组件
│   ├── main.js                          # 入口文件
│   └── style.css                        # 样式文件
└── package.json                         # 前端依赖

knowledge/                                # 知识库
├── 医院信息.md                          # 医院基本信息
├── 科室信息.md                          # 科室介绍
├── 神经内科.md                          # 专科信息
└── ...                                  # 其他医疗文档

3. 核心功能模块分析

核心功能

1. 医疗咨询服务

- 基于临床实践和研究提供专业医疗建议
- 包含病因分析、诊断流程、治疗方案
- 药物治疗指导(药品名称、剂量、疗程)
- 预防措施和应对策略
2. 智能分导诊

- 根据患者病情推荐合适科室
- 基于症状和需求的智能匹配
- 提供就医流程指导
3. 预约挂号服务

- 号源查询功能
- 智能预约挂号
- 预约取消服务
- 预约信息管理


4. 医院信息查询

- 医院基本信息(地址、电话、开放时间)
- 科室介绍
- 乘车路线
- 预约取号地点

//AI助手类型 XiaozhiAgent(医疗挂号客服助手)
@AiService(wiringMode = EXPLICIT,
        chatModel = "qwenChatModel",
        chatMemoryProvider = "chatMemoryProviderXiaozhi",
        tools = "appointmentTools",
        contentRetriever = "contentRetrieverXiaozhi"
        )
public interface XiaozhiAgent {
    @SystemMessage(fromResource = "zhaozhi-prompt-template.txt")
    String chat(@MemoryId Long memoryId, @UserMessage String 
    userMessage);
}

特点 :

- 完整的RAG实现(知识库检索)
- 工具调用能力(预约挂号工具)
- 会话记忆管理
- 专业的医疗客服人设


4. 关键技术实现

//@AiService 是LangChain4j的核心注解,用于定义AI服务接口:


@AiService(
    wiringMode = EXPLICIT,                    // 显式连接模式
    chatModel = "qwenChatModel",            // 使用的聊天模型
    chatMemoryProvider = "chatMemoryProvider", // 记忆提供者
    tools = "appointmentTools",              // 工具列表
    contentRetriever = "contentRetrieverXiaozhi" // 内容检索器
)

参数说明 :

- wiringMode :连接模式,EXPLICIT表示显式配置
- chatModel :指定使用的聊天模型Bean名称
- chatMemoryProvider :记忆提供者,用于管理对话历史
- tools :AI可以调用的工具列表
- contentRetriever :RAG内容检索器 4.1.2 消息类型


@SystemMessage(fromResource = "zhaozhi-prompt-template.
txt")  // 系统消息
String chat(@MemoryId Long memoryId, @UserMessage String 
userMessage);  // 用户消息
```
消息类型 :

- @SystemMessage :系统提示词,定义AI的角色和行为
- @UserMessage :用户消息
- @MemoryId :记忆ID,用于区分不同会话
- @V :变量注入,用于动态参数


RAG(检索增强生成)实现 4.2.1 知识库加载

@Bean
public ContentRetriever contentRetrieverXiaozhi() {
    // 使用FileSystemDocumentLoader读取指定目录下的知识库文档
    Document document1 = FileSystemDocumentLoader.loadDocument
    ("F:\\ai-project\\knowledge\\医院信息.md");
    Document document2 = FileSystemDocumentLoader.loadDocument
    ("F:\\ai-project\\knowledge\\科室信息.md");
    Document document3 = FileSystemDocumentLoader.loadDocument
    ("F:\\ai-project\\knowledge\\神经内科.md");
    List<Document> documents = Arrays.asList(document1, 
    document2, document3);
    
    // 使用内存向量存储
    InMemoryEmbeddingStore<TextSegment> embeddingStore = new 
    InMemoryEmbeddingStore<>();
    
    // 使用默认的文档分割器
    EmbeddingStoreIngestor.ingest(documents, embeddingStore);

    // 从嵌入存储里检索和查询内容相关的信息
    return EmbeddingStoreContentRetriever.from(embeddingStore);
}

RAG流程 :

1. 文档加载 :从知识库加载相关文档
2. 文档分割 :将文档分割成合适的文本段
3. 向量化 :将文本段转换为向量表示
4. 存储 :将向量存储到向量数据库
5. 检索 :根据用户查询检索相关内容
6. 生成 :将检索到的内容作为上下文生成回答 4.2.2 文档解析
项目支持多种文档格式:


聊天记忆管理 MongoDB记忆存储

@Bean
public ChatMemoryProvider chatMemoryProviderXiaozhi() {
    return new ChatMemoryProvider() {
        @Override
        public ChatMemory get(Object memoryId) {
            ChatMemory chatMemory = MessageWindowChatMemory.
            builder()
                    .id(memoryId)
                    .maxMessages(20)  // 最多保存20条消息
                    .chatMemoryStore(mongoChatMemoryStore)
                    .build();
            return chatMemory;
        }
    };  
}

记忆管理特点 :

- 会话隔离 :每个memoryId对应独立的对话历史
- 消息窗口 :限制保存的消息数量,避免上下文过长
- 持久化存储 :使用MongoDB存储,支持重启后恢复
- 自动管理 :框架自动处理消息的添加和检索


工具调用预约挂号工具

@Component
public class AppointmentTools {

    @Autowired
    private AppointmentService appointmentService;

    @Tool(name="预约挂号", value = "根据参数,先执行工具方法
    queryDepartment查询是否可预约,并直接给用户回答是否可预约,并让用户
    确认所有预约信息,用户确认后再进行预约。如果用户没有提供具体的医生姓
    名,请从向量存储中找到一位医生。")
    public String bookAppointment(Appointment appointment) {
        // 查找数据库中是否包含对应的预约记录
        Appointment appointmentDB = appointmentService.getOne
        (appointment);

        if(appointmentDB == null){
            appointment.setId(null);
            if(appointmentService.save(appointment)){
                return "预约成功,并返回预约详情";
            }else{
                return "预约失败";
            }
        }
        return "您在相同的科室和时间已有预约";
    }

    @Tool(name="取消预约挂号", value = "根据参数,查询预约是否存在,如
    果存在则删除预约记录并返回取消预约成功,否则返回取消预约失败")
    public String cancelAppointment(Appointment appointment) {
        Appointment appointmentDB = appointmentService.getOne
        (appointment);
        if(appointmentDB != null){
            if(appointmentService.removeById(appointmentDB.getId
            ())){
                return "取消预约成功";
            }else{
                return "取消预约失败";
            }
        }
        return "您没有预约记录,请核对预约科室和时间";
    }

    @Tool(name = "查询是否有号源", value="根据科室名称,日期,时间和医
    生查询是否有号源,并返回给用户")
    public boolean queryDepartment(
            @P(value = "科室名称") String name,
            @P(value = "日期") String date,
            @P(value = "时间,可选值:上午、下午") String time,
            @P(value = "医生名称", required = false) String 
            doctorName
    ) {
        // TODO: 实现号源查询逻辑
        return true;
    }
}

工具调用特点 :

- 自动选择 :AI根据用户意图自动选择合适的工具
- 参数映射 :自动将用户输入映射到工具参数
- 返回值处理 :工具返回值会作为AI回答的一部分
- 多工具协作 :支持一个对话中调用多个工具
 

小智AI系统提示词 :


你的名字是"硅谷小智",你是一家名为"北京协和医院"的智能客服。
你是一个训练有素的医疗顾问和医疗伴诊助手。
你态度友好、礼貌且言辞简洁。

1、请仅在用户发起第一次会话时,和用户打个招呼,并介绍你是谁。

2、作为一个训练有素的医疗顾问:
请基于当前临床实践和研究,针对患者提出的特定健康问题,提供详细、准确且实用的
医疗建议。请同时考虑可能的病因、诊断流程、治疗方案以及预防措施,并给出在不同
情境下的应对策略。对于药物治疗,请特别指明适用的药品名称、剂量和疗程。如果需
要进一步的检查或就医,也请明确指示。

3、作为医疗伴诊助手,你可以回答用户就医流程中的相关问题,主要包含以下功能:
AI分导诊:根据患者的病情和就医需求,智能推荐最合适的科室。
AI挂号助手:实现智能查询是否有挂号号源服务;实现智能预约挂号服务;实现智能取
消挂号服务。

4、你必须遵守的规则如下:
在获取挂号预约详情或取消挂号预约之前,你必须确保自己知晓用户的姓名(必选)、
身份证号(必选)、预约科室(必选)、预约日期(必选,格式举例:
2025-04-14)、预约时间(必选,格式:上午 或 下午)、预约医生(可选)。
当被问到其他领域的咨询时,要表示歉意并说明你无法在这方面提供帮助。

5、请在回答的结果中适当包含一些轻松可爱的图标和表情。

6、今天是 {{current_date}}。


提示词设计要点 :

1. 角色定义 :明确AI的身份和职责
2. 功能说明 :详细描述AI能提供的服务
3. 规则约束 :设定必须遵守的规则
4. 格式要求 :指定输出格式和风格
5. 动态变量 :使用 {{current_date}} 等变量实现动态内容


5. 对话流程设计


用户发起对话
    ↓
小智AI问候(首次会话)
    ↓
用户提出问题
    ↓
意图识别
    ├─ 医疗咨询 → RAG检索知识库 → 生成专业回答
    ├─ 分导诊需求 → 分析症状 → 推荐科室
    ├─ 预约挂号 → 调用queryDepartment → 确认信息 → 调用
    bookAppointment
    ├─ 取消预约 → 验证预约 → 调用cancelAppointment
    └─ 其他问题 → 礼貌拒绝
    ↓
生成回答
    ↓
更新对话记忆
    ↓
返回给用户

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐