京东健康 AI Agent 开发工程师面试题库

岗位方向:AI Agent / 大模型应用开发(Java 技术栈)
适用场景:一面(技术深度)→ 二面(系统设计)→ 三面(产品视野 + 团队领导力)
核心领域:智能分诊、健康管理、用药依从性、医学知识问答
技术栈:Java/Spring AI、LangChain4j、RAG、多模态、向量数据库


【一面】技术深度考察

1. 自我介绍

回答要点:

  • 控制在 2 分钟内,聚焦 AI Agent 相关经验
  • 结构:教育背景 + 核心技能 + 2-3 个代表性项目 + 当前关注方向
  • 突出:用 Java 技术栈落地大模型应用的实战经验,以及医疗健康场景的领域知识

示例框架:

我叫 xxx,拥有 x 年 Java 开发经验,近两年专注于 AI Agent 在垂直领域的落地。

我主导设计并落地了两款 AI Agent 产品:一个是面向慢病管理的智能健康助手,支持多轮对话、用药提醒、健康报告解读;另一个是京东健康的智能分诊 Agent,日均处理 xxx 条问诊分流请求。

核心技术栈是 Spring AI + LangChain4j,负责过 RAG 知识库搭建、向量化检索、Function Calling 等核心模块的开发。在医疗场景下,我们特别关注幻觉控制、工具调用可靠性和对话状态管理。

最近在研究多 Agent 协同和持续学习方向,也在关注 OpenClaw 等新兴框架。


2. 请介绍一下你参与的项目,以及你在其中的角色和核心贡献

回答要点:

  • 选 1-2 个最相关的项目,重点讲清楚:
    1. 业务背景:解决了什么问题,为用户/业务带来什么价值
    2. 技术架构:整体系统分层,关键模块
    3. 个人贡献:你在其中的具体角色、最有技术含量的部分
    4. 量化成果:上线效果、指标提升(用数据说话)

推荐项目模板(以智能健康助手为例):

项目背景:

慢性病患者(高血压/糖尿病)需要持续监测和用药依从,但传统人工客服成本高、响应慢,我们设计了一个 AI Agent 来提供 7×24 小时的个性化健康管理服务。

个人贡献:

  • 负责整体对话引擎设计,实现多轮对话状态管理(对话历史 + 用户画像 + 健康档案持久化)
  • 实现 RAG 知识库Pipeline:医学指南 → 知识抽取 → 向量化 → Milvus 检索,召回率从 62% 提升至 89%
  • 设计 Function Calling 扩展:挂号预约、药品查询、运动计话,接口调用成功率 > 99.5%
  • 实现护栏机制(Guardrail):用药剂量边界检查、高风险症状识别自动转人工

量化成果:

  • 日均服务用户 5000+,对话轮次平均 8.3 轮
  • 分诊准确率 91%,用户满意度 NPS +38
  • 节省人工客服 40% 工作量

3. AI Agent 与传统的自动化脚本或 RPA 机器人最主要的区别是什么?你是如何理解"智能"这个维度的?

回答要点:从多个维度展开对比,核心体现对"智能"的理解深度

核心区别:

维度RPA/传统自动化脚本AI Agent
决策方式规则驱动,if-else 硬编码LLM 推理,理解自然语言意图
灵活性固定流程,变更需改代码自然语言描述即可执行新任务
泛化能力仅处理预设场景,遇到新场景失效零样本/少样本泛化,处理未见过的输入
交互方式结构化输入(表单/API)自然语言,可多轮追问澄清
学习方式静态,人工更新规则可从交互中学习(RLHF/RL)
工具使用固定 API 集成,编码层面自主判断并调用外部工具(Tool Use)
容错能力遇到异常直接失败可通过推理补偿、尝试替代方案

智能的理解:

“智能"不是"能对话”,而是三层能力的叠加:

第一层:理解(Perception)——能准确理解用户模糊、碎片化、甚至有歧义的表达。比如用户说"我这两天头有点晕",Agent 需要理解这不是"头晕"的字面意思,而是可能涉及血压、血糖、耳石症等多种健康问题。

第二层:推理(Reasoning & Planning)——基于理解,自主拆解任务、规划步骤、调用工具。比如"头晕"→ 判断是否需要测量血压 → 查询用户健康档案 → 若血压异常则触发预警或建议挂号。

第三层:自适应(Learning)——能从历史交互中提取模式,持续优化对单个用户的个性化服务质量。比如一个用户每次提到"没吃药"后面都跟负面情绪,Agent 学会在下次提醒时语气更温和。

传统 RPA 只能执行预定义好的固定路径,AI Agent 则能自主决策下一步该做什么——这才是"智能"的核心体现。


4. 在设计一个 AI Agent 时,你会从哪些方面考虑其系统架构?(可涉及模块划分、数据处理流程)

回答要点:给出清晰的架构分层,结合医疗场景具体说明

推荐架构:

┌─────────────────────────────────────────────────────────────┐
│                     用户交互层(UI / API)                    │
│  文字输入 → 语音识别 → 多模态融合                            │
└──────────────────────────┬──────────────────────────────────┘
                           ▼
┌─────────────────────────────────────────────────────────────┐
│                      Agent 核心引擎                          │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐      │
│  │ 对话状态管理  │  │ 意图识别引擎  │  │  规划器(Planner)│     │
│  │ (Session+DB) │  │ (NLU/分类器)  │  │ (ReAct/CoT)  │      │
│  └──────────────┘  └──────────────┘  └──────────────┘      │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐      │
│  │   护栏层     │  │   记忆层      │  │  工具调度器   │      │
│  │ (Guardrail)  │  │ (短期+长期)   │  │(Tool Router) │      │
│  └──────────────┘  └──────────────┘  └──────────────┘      │
└──────────────────────────┬──────────────────────────────────┘
                           ▼
┌─────────────────────────────────────────────────────────────┐
│                    知识与工具层                               │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐      │
│  │  RAG知识库   │  │  向量数据库   │  │  外部工具API │      │
│  │(医学指南/药品)│  │   (Milvus)   │  │(挂号/药品/检查)│     │
│  └──────────────┘  └──────────────┘  └──────────────┘      │
└──────────────────────────┬──────────────────────────────────┘
                           ▼
┌─────────────────────────────────────────────────────────────┐
│                      模型层                                  │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐      │
│  │  主推理模型   │  │  Embedding   │  │  多模态模型   │      │
│  │(通义/DeepSeek)│  │  (文本向量化) │  │(图像理解)    │      │
│  └──────────────┘  └──────────────┘  └──────────────┘      │
└─────────────────────────────────────────────────────────────┘

模块职责详解:

模块核心职责技术选型
对话状态管理维护多轮对话上下文、用户意图链、健康档案Redis + PostgreSQL
意图识别引擎将用户输入分类到具体 Intent(如"用药咨询"、“挂号预约”)Spring AI Chat Model + Few-shot
规划器(Planner)将高层目标拆解为可执行步骤,决定调用哪些工具ReAct / CoT / ToolFormer
护栏层(Guardrail)内容安全审查、风险症状拦截、高风险操作二次确认自建规则引擎 + LLM Safety Eval
记忆层短期记忆(当前对话)+ 长期记忆(用户健康画像)Redis(短期)+ Milvus(长期)
工具调度器管理可用工具、路由请求、处理超时和降级LangChain4j Tool 接口
RAG 知识库医学知识检索,为 Agent 提供准确的领域知识支撑LangChain4j + Milvus + 医学语料
多模态融合处理图片(皮肤照片、体检报告)并结合文字理解通义 VL / GPT-4V

5. Agent 的核心循环通常包括感知、规划、执行、学习。在 Spring AI 或 LangChain 的框架实践中,你是如何对应实现这几个环节的?能结合一个具体场景(如用药提醒、报告解读)说明吗?

回答要点:结合具体框架和场景讲清楚每个环节的实现方式

以"用药提醒"场景为例拆解四环:

① 感知(Perception):

// Spring AI 方式:用户输入 → 结构化感知
UserMessage userMessage = UserMessage.builder()
    .text("我今天早上忘了吃降压药,现在能补吗?")
    .build();

ChatResponse response = chatModel.call(
    new Prompt(List.of(
        new SystemMessage("你是专业医学助手,从用户输入中提取关键实体:药品名称、剂量、用药时间、当前时间"),
        new UserMessage("我今天早上忘了吃降压药,现在能补吗?")
    ))
);
// 提取结果:{drug: "降压药", missed_time: "早上", current_action: "询问能否补服"}

② 规划(Planning):

// 使用 LangChain4j ReAct 模式
Agent agent = Agent.builder()
    .chatLanguageModel(chatModel)
    .tools(List.of(
        queryDrugInfoTool,    // 查询药品说明
        queryUserMedHistoryTool, // 查询用户历史用药
        sendReminderTool     // 发送提醒
    ))
    .chatMemory(MessageWindowChatMemory.withMaxMessages(20))
    .promptTemplate("""
        你是一个用药管理专家。使用以下格式推理:
        思考:分析用户问题...
        行动:调用[工具名],参数{...}
        观察:从工具返回结果...
        最终回答:综合所有信息给出建议
    """)
    .build();

// 实际执行链:
// 思考:用户询问能否补服降压药 → 需要查询药品半衰期 + 用户用药历史
// 行动:queryDrugInfoTool({drug: "降压药", type: "half_life"})
// 观察:降压药半衰期约24小时,早晨漏服可于中午前补服,剂量减半
// 最终回答:给出补服建议 + 记录本次漏服事件

③ 执行(Execution):

  • 工具调用(Function Calling):查询药品数据库、写入用药记录、更新健康档案
  • 条件分支:若系统判断为高风险(如过量风险),触发人工复核流程
  • 结果格式化:将结构化结果转为用户友好的自然语言回复

④ 学习(Learning):

  • 短期学习:本次对话结果写入对话历史(用于本轮后续追问)
  • 长期学习:提取关键模式(如"漏服后用户通常问什么")更新向量数据库
  • 反馈闭环:用户对回答满意度打分 → 更新意图分类器

6. 在 Java 技术栈中集成大模型能力,你通常会采用哪种方式?比较直接调用 API、使用 Spring AI 框架、或集成 LangChain4j 的优劣和适用场景。

回答要点:三种方案对比,突出场景匹配思维

方案优点缺点适用场景
直接调用 API简单轻量、无额外依赖、易调试缺少抽象、每次换模型需改代码、无工具链支持简单单轮调用、快速 POC
Spring AI与 Spring 生态深度集成、模型抽象层好、配置化能力强、测试支持完善发展早期,部分功能不如 LangChain 完善企业级 Java 项目、需要与现有 Spring Boot 系统集成
LangChain4j工具链完整(Chain/Agent/Tool/Memory)、RAG 支持好、社区活跃JVM 生态,Python 版功能更新快有时延,概念复杂复杂多轮对话、需要丰富工具链、需要快速搭建 Agent 能力

我的实践选择:

对于京东健康这类项目,我推荐 Spring AI + LangChain4j 组合:

  • Spring AI 负责基础设施层(模型抽象、配置管理、安全)
  • LangChain4j 负责业务层(对话管理、工具编排、Chain 复用)
  • 两者可以很好共存:Spring AI 提供 ChatModel,LangChain4j 接收它作为 LLM 实例

代码示例:

// Step 1: Spring AI 配置模型
@Configuration
public class AIConfig {
    @Bean
    public ChatModel qwenChatModel() {
        return new OpenAiChatModel(
            OpenAiChatModelOptions.builder()
                .apiKey(apiKey)
                .modelName("qwen-turbo")
                .temperature(0.7)
                .build()
        );
    }
}

// Step 2: LangChain4j 使用 Spring AI 的 ChatModel
AiServices.builder(MedicalAgentServices.class)
    .chatLanguageModel(qwenChatModel)  // 注入 Spring AI 模型
    .chatMemory(MessageWindowChatMemory.withMaxMessages(20))
    .tools(drugQueryTool, appointmentTool, healthRecordTool)
    .build();

7. AI Agent 在处理多轮对话时,如何有效管理和维护对话状态(Dialog State)与上下文(Context)?你在项目中是如何实现的?

回答要点:讲清楚三层架构 + 具体技术实现

对话状态管理的三层架构:

┌─────────────────────────────────────────────────────┐
│          Layer 1: 当前会话状态(短期)                  │
│  - 最近 N 轮对话内容                                  │
│  - 当前意图 + slot 填充状态                            │
│  - 本轮已调用的工具及结果                               │
│  技术:Redis(TTL 30 分钟)                          │
└────────────────────┬──────────────────────────────────┘
                     ▼
┌─────────────────────────────────────────────────────┐
│         Layer 2: 用户档案状态(中期)                   │
│  - 用户基本信息(年龄、病史、过敏源)                    │
│  - 当前疗程(药品、剂量、周期)                         │
│  - 健康目标与偏好                                      │
│  技术:PostgreSQL(持久化)                           │
└────────────────────┬──────────────────────────────────┘
                     ▼
┌─────────────────────────────────────────────────────┐
│         Layer 3: 长期记忆(历史交互沉淀)               │
│  - 用户历史问题模式、关注话题                           │
│  - 行为偏好(喜欢文字/语音、回复偏好)                  │
│  - 健康趋势(血压/血糖长期曲线)                        │
│  技术:Milvus 向量库(相似检索)                       │
└─────────────────────────────────────────────────────┘

具体实现:

// 对话状态维护类
@Service
public class ConversationStateManager {
    
    // 短期记忆:Redis 存当前会话
    public void saveTurn(String sessionId, String userInput, String agentResponse) {
        String key = "session:" + sessionId;
        List<ChatMessage> history = getHistory(key);
        history.add(new UserMessage(userInput));
        history.add(new AiMessage(agentResponse));
        redisTemplate.opsForValue().set(key, history, 30, TimeUnit.MINUTES);
    }
    
    // 中期记忆:PostgreSQL 存用户档案
    public UserProfile getUserProfile(String userId) {
        return userProfileRepository.findByUserId(userId);
    }
    
    // 长期记忆:向量检索相似历史
    public List<String> retrieveLongTermMemory(String userId, String currentQuery) {
        EmbeddingModel embedding = new BgeSmallZhV15(); // 中文向量化模型
        float[] queryVector = embedding.embed(currentQuery);
        // 检索与该用户相关的历史相似问题
        return milvusClient.search(
            collectionName("user_memory"),
            queryVector,
            filter("user_id=" + userId),
            topK = 5
        );
    }
}

关键设计原则:

  1. 状态分离:短期(Redis)/中期(DB)/长期(向量库)各司其职
  2. 分层注入:每次推理前将三层状态拼装成 Prompt 上下文
  3. 主动压缩:对话超过 20 轮时用 LLM 总结历史,压缩 Token 消耗

8. 使用 Spring AI 时,如何对不同的模型提供商(如 OpenAI、通义千问、本地部署模型)进行抽象和统一管理,以实现灵活的模型切换和降级策略?

回答要点:讲清楚配置抽象 + 降级策略 + 代码示例

// 1. 模型配置抽象(多模型注册中心)
@Configuration
public class ModelRegistry {
    
    @Bean
    public ChatModel openaiModel() {
        return OpenAiChatModel.builder()
            .apiKey(openaiKey)
            .modelName("gpt-4-turbo")
            .build();
    }
    
    @Bean
    public ChatModel qwenModel() {
        return new TongYiChatModel(
            TongYiChatModelOptions.builder()
                .apiKey(qwenKey)
                .modelName("qwen-turbo")
                .build()
        );
    }
    
    @Bean
    public ChatModel localModel() {
        return new OllamaChatModel(
            OllamaChatModelOptions.builder()
                .baseUrl("http://localhost:11434")
                .modelName("qwen2.5:7b")
                .build()
        );
    }
}

// 2. 模型选择器(场景路由)
@Component
public class ModelRouter {
    
    public ChatModel selectModel(String intent, boolean preferLocal) {
        if (preferLocal && hasLocalModel(intent)) {
            return modelRegistry.localModel(); // 降级到本地模型
        }
        // 根据意图路由到最适合的模型
        return switch (intent) {
            case "medical_diagnosis" -> modelRegistry.qwenModel(); // 中文医疗效果最好
            case "simple_qa" -> modelRegistry.localModel();         // 简单问答用本地省钱
            case "complex_reasoning" -> modelRegistry.openaiModel(); // 复杂推理用 GPT-4
            default -> modelRegistry.qwenModel();
        };
    }
    
    // 3. 降级策略:主模型失败自动切换备选
    public String chatWithFallback(String prompt) {
        try {
            return primaryModel.chat(prompt);
        } catch (Exception e) {
            log.warn("主模型调用失败,降级到通义千问: {}", e.getMessage());
            return qwenModel().chat(prompt);
        }
    }
}

降级策略设计:

  1. 模型级降级:OpenAI → 通义千问 → 本地 Ollama(三级跳)
  2. 功能级降级:Agent 模式失败降为简单 RAG 模式
  3. 响应级降级:流式输出失败降为普通同步返回

9. 场景题:假设要为京东健康设计一个"智能分诊"Agent,用户通过文字或语音描述症状,Agent 需要引导问询并初步判断可能的科室或紧急程度。请描述这个 Agent 的关键技术模块和核心处理流程。

回答要点:完整系统设计 + 核心模块详解 + 处理流程

系统架构:

用户(文字/语音)
     ↓
┌──────────────────────────────────────────────────────────────┐
│                    输入处理层                                 │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐          │
│  │  语音识别   │  │  意图分类   │  │  紧急度评估  │          │
│  │ (ASR/Whisper)│ │ (初筛意图)  │  │ (风险分级)   │          │
│  └─────────────┘  └─────────────┘  └─────────────┘          │
└──────────────────────────┬───────────────────────────────────┘
                           ▼
┌──────────────────────────────────────────────────────────────┐
│                    分诊推理引擎                                │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐          │
│  │  症状收集   │  │  鉴别诊断   │  │  科室推荐   │          │
│  │(多轮追问)   │  │ (症状→可能疾病)│ │ (匹配科室)  │          │
│  └─────────────┘  └─────────────┘  └─────────────┘          │
└──────────────────────────┬───────────────────────────────────┘
                           ▼
┌──────────────────────────────────────────────────────────────┐
│                    安全护栏层                                 │
│  风险症状识别(胸痛/呼吸困难/意识障碍)→ 立即建议120           │
└──────────────────────────┬───────────────────────────────────┘
                           ▼
┌──────────────────────────────────────────────────────────────┐
│                    输出层                                      │
│  科室推荐 + 紧急程度 + 挂号建议 + 健康科普                     │
└──────────────────────────────────────────────────────────────┘

核心处理流程:

Step 1: 症状接收
用户:"我最近总是胸闷,爬楼梯的时候喘不上气"
  ↓
Step 2: 紧急度初筛(Guardrail)
  检查是否属于高风险症状(胸痛+呼吸困难 → 立即输出"请立即就医,建议拨打120")
  若非高危 → 继续流程
  ↓
Step 3: 结构化症状提取
LLM 从自然语言提取:{symptom: "胸闷", trigger: "爬楼梯/运动", duration: "最近", severity: "中"}
  ↓
Step 4: 多轮追问(科室收敛)
"您胸闷时有没有伴随心悸(心跳不规律)或头晕?"
  → 收集补充信息,逐步缩小范围
  ↓
Step 5: 科室匹配
基于完整症状 → 查询科室知识库 → 推荐:心血管内科(优先)或呼吸内科(备选)
  ↓
Step 6: 分诊结果输出
"根据您的描述,建议您首先挂【心血管内科】,近期爬楼梯时胸闷可能与心脏供血相关,建议尽快就诊。是否需要我帮您预约明天的号?"
  ↓
Step 7: 预约挂号(Tool Call)
用户确认 → 调用挂号 API → 返回号源信息

关键技术模块详解:

模块实现方式关键点
语音识别Whisper API / 阿里云 ASR支持方言降级,支持嘈杂环境
紧急度评估规则引擎 + LLM 双层过滤规则兜底(胸痛/昏迷优先),LLM 做置信判断
症状提取Few-shot Prompt + 结构化输出输出 JSON Schema 格式,便于后续处理
科室知识库RAG:医学指南 + 科室主诉 → Milvus 向量检索定期更新(医学知识时效性)
问询策略决策树 + LLM 动态生成追问按照"主诉 → 伴随症状 → 时间/频率 → 诱因"顺序收敛
Tool Calling挂号 API + 科室查询 API + 健康科普 API幂等设计 + 超时降级

10. Agent 在调用外部工具(Tool Calling)或 API 时,如何保证调用的可靠性、处理异常与超时?

回答要点:从容错设计、降级策略、重试机制、隔离设计四个角度回答

可靠性保障体系:

① 重试机制(指数退避):

@Retryable(
    value = {HttpTimeoutException.class, HttpServerErrorException.class},
    maxAttempts = 3,
    backoff = @Backoff(delay = 1000, multiplier = 2)
)
public AppointmentResult bookAppointment(AppointmentRequest request) {
    return appointmentApi.book(request);
}

② 超时控制:

RestTemplate template = new RestTemplate();
template.setConnectTimeout(Duration.ofSeconds(3));
template.setReadTimeout(Duration.ofSeconds(10));  // 读取超时 10s

// Agent 调用时设置合理超时
CompletableFuture<AppointmentResult> future = 
    CompletableFuture.supplyAsync(() -> appointmentApi.book(request))
        .orTimeout(10, TimeUnit.SECONDS)  // 全局超时兜底
        .exceptionally(ex -> {
            log.error("挂号超时: {}", ex.getMessage());
            return AppointmentResult.timeout();
        });

③ 降级策略:

public AppointmentResult getAppointmentWithFallback(Long deptId, LocalDate date) {
    try {
        // 主方案:实时查询号源
        return onlineAppointmentApi.query(deptId, date);
    } catch (Exception e) {
        log.warn("实时查询失败,降级到缓存数据: {}", e.getMessage());
        // 降级方案:返回当日号源缓存(每5分钟更新一次)
        return appointmentCache.getCached(deptId, date)
            .orElse(AppointmentResult.unavailable(deptId, date));
    }
}

④ 服务隔离(舱壁模式):

  • 不同工具调用使用独立线程池,避免单一工具阻塞影响整体 Agent
  • 挂号 API 线程池(10 线程)、药品查询线程池(20 线程)、健康档案线程池(5 线程)

⑤ 调用结果校验:

public AppointmentResult validateAndReturn(Object rawResult) {
    if (rawResult == null) return AppointmentResult.failure("接口返回空");
    if (rawResult.getCode() != 200) return AppointmentResult.failure(rawResult.getMessage());
    if (!validateSchema(rawResult)) return AppointmentResult.failure("返回结构不匹配");
    return (AppointmentResult) rawResult;
}

⑥ 幂等设计:

  • 所有工具调用携带唯一 requestId,接口侧做幂等校验
  • 防止 Agent 重试时重复挂号、重复创建记录

11. 在 Agent 的开发中,如何进行效果评估和持续优化?你关注哪些核心指标?

回答要点:区分技术指标和业务指标,建立完整的评估体系

评估指标体系:

类别指标含义目标值
准确性意图识别准确率分类器判断正确的比例> 95%
分诊准确率Agent 科室推荐与最终就诊科室一致> 90%
RAG 召回率知识库检索结果中包含正确答案的比例> 85%
效率首响延迟(P95)用户输入到首次响应时间< 3s
全链路延迟(P95)含工具调用的完整处理时间< 10s
Token 消耗每轮对话平均 Token 成本持续优化
可靠性工具调用成功率外部 API 调用成功的比例> 99%
兜底率需要转人工处理的比例< 5%
体验用户满意度(NPS)用户主动打分的均值> 40
多轮对话维持率对话超过 3 轮的比例> 60%
相似问题重复率用户反复问同一问题的比例监控趋势

持续优化机制:

  1. 线上数据回流:每次对话结束后记录 input → output → user_feedback
  2. Bad Case 分析:每周 review 低分回答,归因分析(幻觉/工具错误/理解偏差)
  3. A/B 测试:Prompt 改版先在 5% 流量验证,效果好再全量
  4. 模型迭代:基于 bad case 优化 Few-shot 示例,定期重训 Embedding 模型

12. 你如何看待 AI Agent 在医疗健康领域的应用边界与伦理风险?在技术实现上如何设置必要的"护栏"(Guardrail)?

回答要点:体现对医疗 AI 的敬畏之心,不能只谈技术,要谈边界意识

应用边界:

AI Agent 在医疗健康领域的定位应该是辅助决策,而非替代医疗判断。我坚持三条红线:

红线 1:不能给出诊断结论
Agent 只能说"根据您描述的症状,建议您挂 XX 科室",不能说"你得了 XX 病"。诊断必须由执业医师做出。

红线 2:不能开具处方
所有用药建议必须引用公开药品说明,且明确标注"请遵医嘱用药"。

红线 3:不能处理急危重症
胸痛、呼吸困难、意识丧失等症状,Agent 必须立即建议拨打 120,不能尝试"分析"。

护栏实现:

// 三层护栏体系

// Layer 1: 规则护栏(兜底,零延迟)
public class RiskSymptomDetector {
    private static final Set<String> HIGH_RISK_KEYWORDS = 
        Set.of("胸痛", "呼吸困难", "意识模糊", "大量出血", "剧烈头痛");
    
    public RiskLevel evaluate(String userInput) {
        if (HIGH_RISK_KEYWORDS.stream().anyMatch(userInput::contains)) {
            return RiskLevel.CRITICAL; // 直接触发 120 建议
        }
        return RiskLevel.NORMAL;
    }
}

// Layer 2: LLM 护栏(语义层面)
public class ContentSafetyGuardrail {
    public boolean isSafe(String response) {
        // 检查回答中是否包含违规内容(诊断结论/处方/极端言论)
        return safetyClassifier.classify(response) == SafeLevel.SAFE;
    }
}

// Layer 3: 合规审查(事后)
public class ComplianceLogger {
    @PostConstruct
    public void logAllResponses() {
        // 所有 Agent 回复写入审计日志,供合规部门抽查
        // 记录:用户ID、输入、输出、时间戳、风险标记
    }
}

伦理风险认识:

  1. 数据隐私:用户健康数据极其敏感,需严格脱敏、加密存储、最小化使用
  2. 公平性:模型对不同地区、不同语言的用户服务质量要一致,防止算法歧视
  3. 透明性:用户需要知道他们在和 AI 对话(标识义务),AI 的能力边界要清晰告知
  4. 可追责性:所有决策链路要可审计,出了问题能找到责任人

【二面】系统设计与深度技术

1. 深入聊聊你做过的项目。遇到的最大技术挑战是什么?你是如何分析并解决的?

回答要点:选择一个有深度的挑战,讲清楚问题分析 → 方案设计 → 实施 → 结果的完整过程

推荐挑战话题:

挑战:医学 RAG 知识库准确率不足(62% → 89%)

问题描述:

健康管理 Agent 中,用户问"二甲双胍和格列美脲能一起吃吗",检索到的文档片段经常答非所问——要么召回的是药品说明书全文(太长,LLM 无法聚焦),要么召回了过期版本的数据。

分析过程:

  1. 根因定位(5 Why 分析):

    • 准确率低 → 检索结果相关性差 → 向量模型不适配医学术语(如"二甲双胍"在不同语境下检索出糖尿病和减肥两种内容)
    • 根本原因:中文医学领域词与通用中文 embedding 存在语义 gap
  2. 数据层面:

    • 医学文档结构混乱(PDF 解析后表格、段落混乱)
    • 药品说明书版本管理不规范,过期内容仍在知识库
  3. 检索层面:

    • 混合检索缺失(仅用向量检索,关键专业术语匹配不足)
    • 重排序(Rerank)环节缺失

解决方案:

  1. 知识库重建:医学指南 → 结构化知识图谱(Neo4j),药品信息单独建库,版本号标注
  2. Embedding 模型微调:用医学问答对(CMRC2019 医学子集)微调 BGE 模型,让专业术语对齐
  3. Hybrid Retrieval:向量检索(80%)+ BM25 关键词检索(20%)并行,取并集
  4. Rerank 模型:用 bge-reranker-large 对 Top-20 结果重排序,取 Top-5

结果:召回率从 62% 提升至 89%,精确率从 41% 提升至 76%,用户满意度 NPS +28。


2. Agent 的规划(Planning)能力至关重要。在复杂的健康管理场景中(如慢性病管理涉及用药、运动、饮食、监测),Agent 如何进行任务分解和步骤规划?有没有研究或应用过 ReAct、ToT 等进阶框架思路?

回答要点:讲清楚规划的意义 + 具体框架的实践 + 医疗场景的适配

为什么规划能力对慢病管理至关重要:

慢病管理不是回答一个问题,而是一个持续多天的行动计划。比如一个糖尿病患者的目标是"3 个月将 HbA1c 从 8.5% 降到 7%",Agent 需要把这个大目标分解为:每日用药提醒、每周运动计划(每周3次有氧,每次30分钟)、每餐饮食建议、每两周血糖监测记录回顾。这就是一个典型的任务规划问题。

ReAct(Reasoning + Acting)框架实践:

// LangChain4j ReAct Agent 模式
Agent agent = AiServices.builder(DiabetesManagementAgent.class)
    .chatLanguageModel(qwenModel)
    .chatMemory(MessageWindowChatMemory.withMaxMessages(30))
    .tools(List.of(
        updateMedicationLogTool,    // 记录用药
        queryGlucoseHistoryTool,   // 查询血糖历史
        generateExercisePlanTool,   // 生成运动计划
        sendReminderTool,           // 发送提醒
        callNutritionApiTool        // 营养建议
    ))
    .promptTemplate("""
        你是一个糖尿病健康管理专家。用户目标:{goal}
        
        当前时间:{current_time}
        用户最新数据:
        - 血糖:{latest_glucose}
        - 用药:{medication_status}
        
        请按以下步骤推理并行动:
        Thought: 分析当前状态,判断下一步最重要的事
        Action: 调用工具[工具名],参数{...}
        Observation: 工具返回结果
        Final: 给出个性化建议或执行具体操作
    """)
    .build();

// 示例执行链:
// Thought: 用户 HbA1c 为 8.5%(偏高),用药规律,但近3天血糖波动大(餐后12.8 mmol/L)
//          需要分析原因。查看最近饮食记录和运动情况。
// Action: queryGlucoseHistoryTool({days: 7})
// Observation: 发现餐后血糖在 11-14 mmol/L 波动,午餐后特别高
// Action: queryUserDietLog({meals: "lunch", days: 3})
// Observation: 午餐碳水摄入偏高(米饭约250g)
// Action: generateExercisePlanTool({goal: "降低餐后血糖", constraint: "30分钟有氧"})
// Final: "根据您近3天数据,午餐后血糖偏高,建议将米饭量减少至150g,餐后30分钟散步20分钟,预计可将餐后血糖降低 15-20%。"

ToT(Tree of Thoughts)进阶实践:

对于需要复杂推理的场景(如判断是否需要调整降糖药剂量),我使用 ToT 框架:让 LLM 生成多个可能的方案树,然后评估每个分支的优劣,选择最优路径。

// ToT 规划示例:糖尿病药物调整规划
public class ToTPlanner {
    
    public MedicationPlan planMedicationAdjustment(UserState state) {
        // Step 1: 生成多个可能方案(并行采样)
        List<String> options = llm.batchGenerate("""
            用户情况:HbA1c=8.5%, 近7天空腹血糖波动在 7-9 mmol/L,
            餐后血糖 11-14 mmol/L, 当前用药:二甲双胍 500mg BID。
            请给出3种不同的药物调整方案,每种包含:调整策略、预期效果、风险评估。
        """, n = 3);
        
        // Step 2: 评估每个方案
        List<PlanScore> scoredPlans = options.stream().map(opt -> {
            double effectScore = evaluateEffect(opt, state);    // 预期效果
            double riskScore = evaluateRisk(opt, state);        // 风险
            double costScore = evaluateCost(opt);               // 用药成本
            return new PlanScore(opt, effectScore, riskScore, costScore);
        }).toList();
        
        // Step 3: 选择最优方案(综合评分最高)
        return scoredPlans.stream()
            .max(Comparator.comparingDouble(PlanScore::totalScore))
            .map(PlanScore::getPlan)
            .orElse(defaultPlan);
    }
}

医疗场景的规划约束:

  1. 所有规划方案必须经过安全校验(剂量边界、禁忌检查)才能执行
  2. 高风险调整(如增加胰岛素剂量)需要医生确认才能执行
  3. 规划结果要给用户明确说明依据和不确定性,不能过于笃定

3. RAG 是增强 Agent 知识准确性的关键。在健康领域,如何构建高质量的医学知识库(数据来源、清洗、结构化)?在检索阶段,如何提升查询与文档的匹配精度,并处理可能的冲突或过期信息?

回答要点:医学知识库的特殊性 + 全流程方案

数据来源分级:

优先级数据来源权威性更新频率
S级药品说明书(NMPA)、临床指南(中华医学会)、诊疗规范⭐⭐⭐⭐⭐季度更新
A级医学教科书(8年制内科学)、UpToDate 摘要⭐⭐⭐⭐年度更新
B级CSDN/丁香园/医学论坛高质量问答(需人工审核)⭐⭐⭐按需更新
C级用户生成内容(UGC)健康管理记录⭐⭐实时更新

知识库构建流程:

原始医学文档(PDF/HTML)
    ↓
【解析层】
  PDF 解析(pdfbox)→ 文本提取
  表格识别(table extraction)→ 结构化 JSON
  命名实体识别(BERT-NER)→ 药品/症状/检查指标实体提取
    ↓
【结构化层】
  知识图谱构建(Neo4j):药品-适应症-禁忌-相互作用
  药品知识库(独立库):名称/规格/用法/不良反应/相互作用
  症状-科室映射库:主诉 → 可能科室(收敛版)
    ↓
【向量化层】
  分块策略:按语义段落(300-500 tokens/块)+ 保留上下文标题
  Embedding:医学领域微调模型(bge-medical-zh)
  元数据标注:来源、发布时间、版本号、适用范围
    ↓
【质量控制层】
  准确性:医学专家抽检(5% 覆盖率)
  时效性:版本号追踪,过期内容标记为 deprecated
  一致性:相同药品不同来源的冲突检测

检索精度提升:

  1. 混合检索:

    public List<Document> hybridSearch(String query) {
        // 向量检索(语义相似)
        List<Document> semanticResults = milvusClient.search(query, topK=20);
        
        // BM25 关键词检索(术语精确匹配)
        List<Document> keywordResults = bm25Search(query, topK=20);
        
        // 加权合并 + Rerank
        List<Document> merged = mergeResults(semanticResults, keywordResults, weights=[0.7, 0.3]);
        return reranker.rerank(merged, topK=5);  // bge-reranker-large
    }
    
  2. 查询扩展(Query Expansion):

    • 用户输入"头疼" → 扩展为"头痛、头部不适、偏头痛"
    • 使用同义词库(中医药学领域同义词表)进行查询改写
  3. 上下文重排(Contextual Rerank):

    • 将用户健康档案(病史、用药)作为上下文传入 Rerank 模型
    • 优先召回与用户具体情况最相关的医学知识(如糖尿病用户优先召回糖尿病相关内容)

冲突与过期处理:

public class KnowledgeQualityController {
    
    // 过期检测:文档版本号与当前知识库版本对比
    public boolean isOutdated(Document doc) {
        return doc.getVersion() < currentKnowledgeVersion;
    }
    
    // 冲突检测:同一药品不同来源说法矛盾时,优先权威来源
    public Document resolveConflict(List<Document> docs) {
        // 优先级:NMPA > 临床指南 > 教科书 > 论坛
        return docs.stream()
            .sorted(Comparator.comparing(Document::getSourcePriority).reversed())
            .findFirst()
            .orElseThrow(() -> new ConflictException("无法解决文档冲突"));
    }
    
    // 标记不确定性:来源为 C 级时,答案后附"此信息来自社区分享,建议咨询医生"
    public String addDisclaimer(Document doc, String answer) {
        if (doc.getSourcePriority() <= 2) {
            return answer + "\n\n⚠️ 以上信息仅供参考,来自[来源名称],建议咨询专业医生确认。";
        }
        return answer;
    }
}

4. 多模态能力整合:如果 Agent 需要处理用户的皮肤照片、体检报告图片等,并结合文字描述进行判断,在架构上如何设计?涉及哪些关键组件和技术选型?

回答要点:多模态架构设计 + 具体组件选型

架构设计:

┌─────────────────────────────────────────────────────────────┐
│                    多模态输入处理层                          │
│  ┌────────────┐  ┌────────────┐  ┌────────────┐           │
│  │ 皮肤照片    │  │ 体检报告图  │  │  文字描述   │           │
│  │(手机拍摄)   │  │(PDF/扫描)  │  │  (症状描述) │           │
│  └──────┬─────┘  └──────┬─────┘  └──────┬─────┘           │
│         │              │              │                   │
│  ┌──────▼─────┐  ┌──────▼─────┐  ┌──────▼─────┐          │
│  │  图像预处理  │  │  OCR识别   │  │   NLU     │          │
│  │(去噪/旋转)  │  │(提取表格)   │  │(意图/实体) │          │
│  └──────┬─────┘  └──────┬─────┘  └──────┬─────┘          │
└─────────┼───────────────┼───────────────┼──────────────────┘
          │               │               │
          └───────────────┼───────────────┘
                          ▼
┌─────────────────────────────────────────────────────────────┐
│                    多模态融合层                              │
│  ┌─────────────────────────────────────────────────┐       │
│  │  多模态理解模型(皮肤图像 + 体检报告 + 文字)         │       │
│  │  通义 VL 2.0 / GPT-4V / Gemini Pro Vision         │       │
│  └─────────────────────────────────────────────────┘       │
│  输出:结构化医学解读(症状描述 + 图片发现 + 综合判断)       │
└──────────────────────────┬──────────────────────────────────┘
                           ▼
┌─────────────────────────────────────────────────────────────┐
│                    多模态 Agent 决策层                       │
│  - 皮肤图片发现 → 是否需要皮肤科转诊                         │
│  - 体检报告异常指标 → 结合文字症状综合判断                    │
│  - 高风险发现 → 触发医生介入通知                             │
└─────────────────────────────────────────────────────────────┘

关键组件选型:

功能技术选型选型理由
图像编码通义 VL 2.0(阿里)/ GPT-4V(OpenAI)中文理解好,支持长上下文(体检报告多页)
OCR 识别PaddleOCR(自部署)或 阿里云 OCR支持表格结构化提取,医学术语识别准确
皮肤图像分析专用皮肤病分类模型(如 SkinGPT 架构)+ 通义 VL通用模型对皮肤病识别效果一般,需要垂类模型补充
多模态融合Qwen-VL-Chat(免费)+ RAG 知识库开源中文多模态,部署成本低
报告结构化表格检测模型 + 正则解析体检报告格式相对固定(表格+数值),可规则+模型结合

具体实现流程:

public class MultimodalAnalysisResult analyzeSkinCondition(String imageUrl, String description) {
    // Step 1: 图片理解
    String imageAnalysis = qwenVL.analyzeImage(imageUrl, """
        请详细描述这张皮肤照片:
        1. 病灶位置、大小、形状、颜色
        2. 是否有红肿、渗液、脱屑
        3. 您的初步判断(请注明置信度)
    """);
    
    // Step 2: 结合症状描述综合判断
    String combinedAnalysis = chatModel.call("""
        图片分析结果:{imageAnalysis}
        用户自述:{description}
        请综合图片和文字信息:
        1. 判断可能疾病类型(并给出置信度和依据)
        2. 是否需要立即就医
        3. 建议就诊科室
    """);
    
    // Step 3: 安全护栏
    if (detectedHighRiskCondition(combinedAnalysis)) {
        // 高风险情况自动通知医生
        doctorNotificationService.notify(imageAnalysis, combinedAnalysis);
    }
    
    return MultimodalAnalysisResult.builder()
        .imageDescription(imageAnalysis)
        .combinedDiagnosis(combinedAnalysis)
        .departmentRecommendation(determineDepartment(imageAnalysis))
        .riskLevel(determineRiskLevel(imageAnalysis))
        .build();
}

5. Agent 的"记忆"机制。如何设计长期记忆和短期记忆,以支持对用户个性化健康习惯的学习和持续服务?在实现上,如何与向量数据库、传统数据库结合?

回答要点:记忆架构设计 + 三层实现 + 医疗场景的特殊处理

三层记忆架构:

层级内容技术选型TTL/更新频率
感官记忆当前轮对话的原始输入输出LLM 内部隐状态本轮对话内
工作记忆最近 20 轮对话摘要 + 当前任务上下文Redis(进程内)30 分钟
长期记忆用户健康画像、行为模式、偏好PostgreSQL + Milvus持久化 + 按需更新

短期记忆(工作记忆)实现:

@Service
public class WorkingMemoryManager {
    
    // 滑动窗口:保留最近 N 轮完整对话 + 压缩摘要
    public ConversationContext buildWorkingContext(String sessionId) {
        List<ChatMessage> recentMessages = redisTemplate.opsForList()
            .range("chat:" + sessionId, -20, -1);
        
        if (recentMessages.size() >= 15) {
            // 超过 15 轮时压缩历史(节省 Token)
            String summary = llm.summarize压缩对话(
                "将以下对话压缩为 3 句话摘要,保留关键信息:\n" +
                joinMessages(recentMessages.subList(0, recentMessages.size() - 1))
            );
            return new ConversationContext(summary, recentMessages.getLast());
        }
        return new ConversationContext(recentMessages);
    }
}

长期记忆(用户健康画像)实现:

@Entity
@Table(name = "user_health_profile")
public class UserHealthProfile {
    private String userId;
    private Map<String, Object> healthBaseline;    // 基线数据:血压/血糖正常范围
    private List<String> chronicConditions;         // 慢病列表
    private List<String> allergies;                 // 过敏源
    private List<String> medicationCurrent;         // 当前用药
    
    // 通过向量库存储用户行为模式
    // 例如:"用户每次提到'没吃药'后情绪低落" → 存入 Milvus
}

@Service
public class LongTermMemoryManager {
    
    // 存入长期记忆(用户行为模式)
    public void storeBehaviorPattern(String userId, String pattern, float confidence) {
        EmbeddingModel embedding = new BgeZh15();
        float[] vector = embedding.embed("用户行为:" + pattern);
        milvusClient.insert(
            Collection.of("user_memory"),
            vector,
            Metadata.of(
                "user_id", userId,
                "pattern", pattern,
                "confidence", confidence,
                "timestamp", Instant.now().toString()
            )
        );
    }
    
    // 检索相似历史模式
    public List<String> retrieveSimilarPatterns(String userId, String currentSituation) {
        float[] queryVector = embedding.embed(currentSituation);
        return milvusClient.search(
            Collection.of("user_memory"),
            queryVector,
            Filter.eq("user_id", userId),
            topK=5
        ).stream().map(r -> r.getString("pattern")).toList();
    }
}

记忆与知识库的融合:

public class MemoryAugmentedRAG {
    
    public String answerWithMemory(String userId, String question) {
        // 1. 检索用户长期记忆(个性化上下文)
        List<String> userPatterns = memoryManager.retrieveSimilarPatterns(userId, question);
        
        // 2. 检索通用医学知识
        List<Document> medicalKnowledge = ragPipeline.retrieve(question, topK=5);
        
        // 3. 拼装增强 Prompt
        String enhancedPrompt = """
            用户画像:{getUserProfile(userId)}
            历史模式:{userPatterns}
            相关医学知识:
            {medicalKnowledge}
            
            当前问题:{question}
            请结合用户个性化情况给出回答。
        """;
        
        // 4. 生成答案
        return chatModel.call(enhancedPrompt);
    }
}

医疗场景的特殊设计:

  • 敏感信息保护:健康档案中的敏感字段(诊断结果、用药记录)需要加密存储,Agent 访问时做脱敏处理
  • 记忆时效性:慢病管理中,健康基线(血压、血糖目标值)需要定期复核更新
  • 遗忘机制:用户主动要求删除记忆的能力(GDPR 合规)

6. 场景题:设计一个"智能用药依从性管理 Agent"。它需要提醒用户服药,并能回答用户关于"忘吃了怎么办"、"有副作用如何处理"等复杂咨询。请详细阐述其系统设计、核心交互逻辑以及可能用到的 AI 模型工具。

回答要点:完整系统设计,覆盖所有功能模块

系统架构:

┌─────────────────────────────────────────────────────────────┐
│                        用户触达渠道                           │
│  App 推送 / 微信小程序 / 电话外呼 / 短信                       │
└──────────────────────────┬──────────────────────────────────┘
                           ▼
┌─────────────────────────────────────────────────────────────┐
│                    核心 Agent 模块                           │
│  ┌────────────┐  ┌────────────┐  ┌────────────┐           │
│  │ 用药提醒引擎 │  │ 咨询问答引擎 │  │ 依从性分析引擎 │           │
│  │(定时任务)   │  │(RAG+LLM)   │  │(数据统计)   │           │
│  └────────────┘  └────────────┘  └────────────┘           │
└──────────────────────────┬──────────────────────────────────┘
                           ▼
┌─────────────────────────────────────────────────────────────┐
│                    知识与数据层                               │
│  药品说明书库 / 用药知识库 / 用户档案 / 依从性记录              │
└─────────────────────────────────────────────────────────────┘

核心功能模块设计:

① 用药提醒引擎:

  • 基于处方信息生成定时提醒任务(晨起/餐后/睡前)
  • 提醒策略:首次提醒 → 15分钟后未确认 → 第二次提醒 → 1小时后仍未确认 → 通知家属
  • 智能调整:根据用户反馈(“太早了起不来”)动态调整提醒时间

② 漏服处理咨询:

// 漏服处理 RAG 问答
public String handleMissedDose(String userId, String drugName, String missedTime) {
    // 1. 查询药品漏服处理规则
    DrugPolicy policy = drugKnowledgeBase.getMissedDosePolicy(drugName);
    
    // 2. 查询用户用药历史
    List<MedicationLog> history = medicationLogRepository.findRecent(userId, drugName, days=7);
    
    // 3. 构造个性化回答
    String response = llm.generate("""
        药品漏服政策:{policy}
        用户历史:{history}
        用户问题:我{drugName}漏吃了,时间是{missedTime},现在怎么办?
        请给出:① 是否需要补服(附具体规则)② 补服注意事项 ③ 下次正常服药时间调整
        注意:涉及胰岛素等高风险药品时,必须提示"请咨询医生后再决定"
    """);
    
    return addSafetyDisclaimer(response, drugName);
}

③ 副作用咨询:

// 副作用处理 RAG 问答
public String handleSideEffect(String userId, String drugName, String symptom) {
    // 1. 查询药品已知副作用列表
    List<SideEffect> knownEffects = drugKnowledgeBase.getKnownSideEffects(drugName);
    
    // 2. 判断症状严重程度
    SeverityLevel severity = sideEffectClassifier.classify(symptom, knownEffects);
    
    // 3. 根据严重程度差异化处理
    return switch (severity) {
        case MILD -> normalSideEffectAdvice(drugName, symptom, knownEffects);
        case MODERATE -> moderateSideEffectAdvice(drugName, symptom, knownEffects);
        case SEVERE -> severeSideEffectAdvice(drugName, symptom, knownEffects);
        // SEVERE 情况:立即建议就医,不通过 AI 自主处理
    };
}

核心交互逻辑:

用户:"降压药忘吃了,现在下午3点了"
  ↓
Agent 问询澄清:「您吃的是哪种降压药?早上几点应该吃?」
  ↓
用户:「络活喜,晨起吃的」
  ↓
Agent 查询:络活喜(氨氯地平)半衰期 35-50 小时
  ↓
判断:漏服时间在 6 小时内 → 可以补服,建议下午 4 点前补服半片
  ↓
执行:记录本次漏服事件,更新依从性统计
  ↓
输出:「络活喜漏服 6 小时内可补服。建议现在吃半片(2.5mg),明天恢复正常晨起服用。注意监测血压,若有头晕等不适立即休息并就医。」
  ↓
护栏检查:「若血压高于 160/100 mmHg 或有胸痛,立即拨打 120」

AI 模型工具组合:

能力模型/工具说明
对话理解通义千问(Qwen-Turbo)中文理解好,响应快
药品知识 RAGLangChain4j + Milvus知识检索
用药安全判断规则引擎 + LLM 双层规则兜底,LLM 增强
数据统计PostgreSQL + Grafana依从性报表
提醒触达极光推送 / 阿里云 SMS消息推送

7. Spring AI 的 Function Calling 支持是怎样的?在项目中,你是如何定义和管理这些可供 Agent 调用的函数的?如何保证函数调用的安全性和权限控制?

回答要点:Spring AI Function Calling 机制 + 安全设计

Spring AI Function Calling 支持:

// 定义一个可用工具(Function)
public class AppointmentBookingFunction implements Tool {
    
    @Bean
    public Tool appointmentTool() {
        return Tool.builder()
            .name("book_appointment")
            .description("预约挂号。用户说「帮我挂心血管内科明天的号」时使用。")
            .inputSchema("""
                {
                  "type": "object",
                  "properties": {
                    "department": {"type": "string", "description": "科室名称"},
                    "date": {"type": "string", "description": "预约日期,格式 YYYY-MM-DD"},
                    "patientName": {"type": "string", "description": "患者姓名"}
                  },
                  "required": ["department", "date"]
                }
            """)
            .action(this::bookAppointment)  // 执行逻辑
            .build();
    }
    
    public AppointmentResult bookAppointment(Map<String, Object> params) {
        String department = (String) params.get("department");
        String date = (String) params.get("date");
        String patientName = (String) params.get("patientName");
        // 调用真实挂号 API
        return appointmentApi.book(department, date, patientName);
    }
}

工具注册与管理:

@Configuration
public class ToolRegistry {
    
    @Autowired private Tool appointmentTool;
    @Autowired private Tool drugQueryTool;
    @Autowired private Tool healthRecordTool;
    @Autowired private Tool reminderTool;
    
    @Bean
    public List<Tool> allTools() {
        return List.of(
            appointmentTool,
            drugQueryTool,
            healthRecordTool,
            reminderTool
        );
    }
    
    // 工具分组(根据用户权限)
    public List<Tool> toolsForUser(UserRole role) {
        return switch (role) {
            case PATIENT -> List.of(drugQueryTool, healthRecordTool, reminderTool);  // 无挂号权限
            case DOCTOR -> allTools();  // 医生可用全部
            case ADMIN -> allTools();
        };
    }
}

安全性保障:

安全维度实现方式
权限控制工具注册时绑定角色,患者角色无法调用"修改处方"类高危工具
参数校验JSON Schema 校验输入,拒绝不合规参数(如负数剂量、未来日期)
调用限流每用户每分钟同一工具最多调用 10 次,防止滥用
审计日志所有工具调用记录日志(用户/工具/参数/结果/时间),支持事后追溯
超时控制单次工具调用超时 10s,超时自动返回错误
灰度验证高风险工具(如"开具处方")需要医生二次确认,不做自动化执行

8. 在微服务架构下,如何将 AI Agent 能力以服务的形式提供?如何设计 API 接口、如何处理高并发下的 Agent 实例管理与资源隔离?

回答要点:微服务暴露 AI 能力 + 高并发设计

服务拆分设计:

┌──────────────────────────────────────────────────────────────┐
│                      API Gateway                             │
│  /ai-agent/chat  →  对话服务(长连接,流式输出)              │
│  /ai-agent/rag   →  知识检索服务(同步,短响应)              │
│  /ai-agent/tools →  工具注册管理                              │
└──────────────────────────────────────────────────────────────┘
          │                      │                    │
          ▼                      ▼                    ▼
┌─────────────────┐   ┌─────────────────┐   ┌─────────────────┐
│  Chat Service   │   │   RAG Service   │   │  Tool Service   │
│  (Spring WebFlux)│   │  (同步调用)     │   │  (注册/发现)    │
│  - 流式响应     │   │  - 向量检索     │   │  - 权限管理     │
└────────┬────────┘   └────────┬────────┘   └─────────────────┘
         │                      │
         ▼                      ▼
┌─────────────────┐   ┌─────────────────┐
│ Agent Cluster   │   │  Milvus Cluster │
│ (多实例+负载均衡) │   │  (知识库服务)   │
└─────────────────┘   └─────────────────┘

API 接口设计:

// 对话 API(流式响应)
@RestController
@RequestMapping("/ai-agent")
public class AgentController {
    
    @PostMapping("/chat")
    public Flux<String> chat(@RequestBody ChatRequest request,
                              @RequestHeader("X-User-Id") String userId) {
        // 验证 Token + 权限
        // 限流:每用户 10 次/分钟
        return agentService.streamChat(request, userId)
            .take(Duration.ofSeconds(60))  // 最大响应时间 60s
            .onErrorResume(e -> Flux.just("抱歉,服务暂时不可用,请稍后再试。"));
    }
    
    // 同步知识检索(轻量)
    @PostMapping("/rag/query")
    public RAGResult query(@RequestBody RAGRequest request) {
        return ragService.query(request.getQuestion());
    }
}

高并发下的实例管理:

  1. Agent 实例池化:

    • 使用 Spring WebFlux(非阻塞)+ Reactor 实现高并发(单实例支持 1000+ 并发)
    • Kubernetes HPA 基于 CPU + 队列长度自动扩缩容
    • 冷启动优化:Agent 实例预热(提前加载模型到内存)
  2. Token 消耗隔离:

    • 按用户维度隔离 Token 配额,避免单个用户耗尽全局 Token
    • 使用 Redis 计数实现 Token 配额管理
  3. 资源隔离:

    • 不同优先级的请求走不同队列:紧急(医生端)优先,低优先级(用户端)正常队列
    • GPU 资源池:LLM 推理使用 GPU 池,共享调度
# Kubernetes HPA 配置
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: agent-service-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: agent-service
  minReplicas: 2
  maxReplicas: 20
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  - type: Pods
    pods:
      metric:
        name: agent_queue_length
      target:
        type: AverageValue
        averageValue: "10"

9. 谈谈你对 LangChain(或 LangChain4j)中 Chain、Agent、Tool 这些核心抽象的理解。它的设计哲学对你构建 Agent 系统时有什么启发或影响?

回答要点:理解核心抽象的设计意图 + 对实际系统设计的启发

核心抽象理解:

Chain(链):

Chain 是将多个操作有序串联的执行单元。最经典的 LLMChain = Prompt + LLM + OutputParser。它的设计哲学是确定性:给定相同的输入,经过 Chain 的每一步都是可预测的。

类比:在健康管理场景中,"用药提醒流程"就是一个 Chain:触发提醒 → 查询药品信息 → 构造提醒内容 → 发送通知。每一步都是固定的,不依赖 LLM 自主决策。

Agent(智能体):

Agent 是带自主决策能力的 Chain。它不只是执行固定步骤,而是根据当前状态判断"下一步该做什么"。核心循环:感知 → 推理(ReAct/CoT)→ 选择工具 → 执行 → 观察结果 → 继续循环。

类比:智能分诊就是一个 Agent。用户说"胸闷",Agent 自主决定:先问"有没有伴随心悸"(工具:追问)→ 查询科室知识库(工具:RAG)→ 推荐科室(工具:科室推荐API)。

Tool(工具):

Tool 是 Agent 可以调用的外部能力。LangChain 提供了标准化接口,任何外部 API、本地函数、数据库查询都可以封装为 Tool。

关键点:工具本身是被动的,只有被 Agent 调用时才生效。工具的定义包含:名称、描述(供 LLM 理解何时使用)、输入 schema、执行逻辑。

设计哲学的启发:

LangChain 设计理念对我的系统设计启发
可组合性:Chain 可以嵌套 Chain将复杂流程拆解为可复用的小 Chain(如"问诊 Chain"、“挂号 Chain”)
工具抽象:所有外部能力统一 Tool 接口统一封装挂号/药品/健康档案等 API,降低 Agent 与外部系统的耦合
记忆分离:Memory 独立于 Agent短期/长期记忆分层设计,避免对话膨胀
Prompt 模板化:Chain 的每一步可插拔 Prompt将医疗场景的专家知识固化为 Prompt 模板,降低 LLM 的幻觉风险
评估驱动:内置 evaluation 工具建立 Bad Case 库,每次更新前先跑评估集,确保质量不下降

LangChain4j 的局限性(实战总结):

  • 调试困难:Agent 内部决策黑盒,出问题时难以追踪是 Prompt 问题还是工具问题
  • 生产监控缺失:需要自建 Tracing(我使用 OpenTelemetry + Jaeger)
  • Java 生态更新滞后:Python 版本功能领先 3-6 个月,需要定期迁移

10. 如何对 AI Agent 系统进行监控和可观测性建设?除了常规的 QPS、耗时,你会特别关注哪些与 AI 相关的指标(如 Token 消耗、推理速率、工具调用成功率等)?

回答要点:完整的可观测性体系 + AI 特有指标

可观测性三支柱:

Metrics(指标)     Logs(日志)          Traces(链路追踪)
     │                  │                    │
 QPS/延迟/错误率    结构化日志          请求全链路追踪
 + AI 特有指标       + Prompt 日志        + Agent 决策路径
 + Token 消耗        + Tool 调用记录       + RAG 检索过程

AI 特有监控指标体系:

维度指标说明告警阈值
Token 消耗每小时 Token 总消耗成本控制超过日均 200%
每用户 Token 消耗异常用户检测单用户 > 日均 5 倍
Token 使用效率有效 Token / 总 Token< 60%(可能存在 Prompt 膨胀)
推理质量工具调用成功率工具返回有效结果的比例< 95%
RAG 召回率检索结果包含正确答案的比例< 80%
幻觉率回答中出现事实错误的比例< 2%
兜底率需要转人工处理的比例> 5%
推理性能LLM 首 token 延迟模型开始响应时间P95 < 2s
LLM 推理速率tokens/秒< 20 tokens/s(模型可能过热)
向量检索延迟Milvus 查询时间P95 < 100ms
用户反馈满意度评分分布1-5 分打分平均分 < 3.5
回复有用率用户标记"有用"的比例< 70%

Prometheus + Grafana 监控大盘:

# Prometheus 指标定义(示例)
agent_tokens_total{category="rag", model="qwen-turbo"} 1234567
agent_tool_calls_total{tool="drug_query", status="success"} 98234
agent_tool_calls_total{tool="drug_query", status="failed"} 123
agent_rag_recall_rate{source="medical_knowledge"} 0.89
agent_hallucination_rate{} 0.015

链路追踪(OpenTelemetry):

// 为每个 Agent 决策步骤添加 Span
Span span = tracer.spanBuilder("agent.react.step")
    .setAttribute("step", "action")
    .setAttribute("tool", selectedTool)
    .setAttribute("tool_input", toolParams)
    .startSpan();

try {
    Object result = toolExecutor.execute(selectedTool, toolParams);
    span.setAttribute("tool_result", "success");
    span.setAttribute("tool_result_size", result.toString().length());
} catch (Exception e) {
    span.setAttribute("tool_result", "error");
    span.recordException(e);
} finally {
    span.end();
}

日志规范(结构化 JSON):

{
  "timestamp": "2026-05-15T08:00:00Z",
  "level": "INFO",
  "type": "agent_tool_call",
  "session_id": "abc123",
  "user_id": "user456",
  "intent": "drug_side_effect",
  "tool": "drug_side_effect_query",
  "tool_params": {"drug": "二甲双胍", "symptom": "恶心"},
  "tool_result": "MILD",
  "latency_ms": 342,
  "token_used": 1234,
  "feedback": null
}

告警规则示例:

# Prometheus Alert Rule
- alert: AgentToolCallFailureRate
  expr: |
    sum(rate(agent_tool_calls_total{status="failed"}[5m])) 
    / sum(rate(agent_tool_calls_total[5m])) > 0.05
  for: 2m
  labels:
    severity: warning
  annotations:
    summary: "Agent 工具调用失败率超过 5%"
    description: "过去 5 分钟失败率为 {{ $value | humanizePercentage }}"

【三面】产品愿景与团队领导力

1. 抛开具体技术,从产品和技术愿景角度,你认为一个理想的"京东健康 AI 健康助手"应该具备哪些核心能力和特征?它与目前常见的客服机器人或知识库搜索有何本质不同?

回答要点:产品愿景表达 + 差异化认知

理想 AI 健康助手的核心能力:

  1. 持续性陪伴,而非一次性问答

    传统客服是"问答式"的,用户问完即走。理想的健康助手应该像"私人健康顾问"一样,持续跟踪用户的健康状态,主动发现问题而非被动响应。比如用户说"最近睡眠不好",传统机器人会回答睡眠建议然后结束对话;理想助手则会记住这个信号,3天后主动问"睡眠有改善吗?“,7天后问"需要我帮你预约睡眠门诊吗?”

  2. 个性化,而非通用回答

    每个人的身体状况、用药历史、生活习惯都不同,理想的助手给出的建议应该是"为你量身定做"的,而非从通用知识库里检索出来的标准答案。

  3. 主动性干预,而非被动回答

    不是等用户来问,而是主动发现问题:血糖仪数据异常了,主动联系用户;用户连续 3 天没有运动,主动提醒并调整计划;体检报告出结果了,主动解读并建议下一步。

  4. 跨模态理解,不只是文字

    能看懂体检报告图片、皮肤照片、处方照片,能理解语音描述的症状(老人不会打字),能处理多种输入形式的混合(语音+图片+文字)。

  5. 可信可控,安全第一

    在医疗领域,用户对 AI 的信任建立在"AI 知道自己不知道什么"的基础上。理想助手会主动说"这个建议需要咨询医生",而不确定时不会瞎猜。

本质差异:

维度传统客服机器人知识库搜索理想 AI 健康助手
交互模式单轮问答搜索-匹配多轮持续跟踪
个性化无(所有人同一回答)弱(基于搜索结果)强(基于健康档案)
主动性被动被动主动干预
记忆能力无无长期记忆用户
风险意识无无有边界,知道何时该转人工
核心价值解答问题检索知识管理健康、预防风险

2. 在技术决策层面,当面对一个全新的快速演进的 AI Agent 技术栈(如不断更新的 LangChain、各种新框架)和一个你们团队已经熟悉但可能并非最优的旧方案时,你会如何做技术选型?决策过程中会重点评估哪些维度?

回答要点:技术决策框架 + 具体评估维度

技术选型决策框架:

┌─────────────────────────────────────────────────────┐
│              技术选型三维评估模型                     │
│                                                    │
│   ┌───────────────┐                                │
│   │  业务契合度   │  ← 能否解决真实业务问题?        │
│   │  (Must Have) │    优先级最高                   │
│   └───────────────┘                                │
│          │                                         │
│   ┌───────────────┐   ┌───────────────┐           │
│   │   团队能力    │ + │   生态成熟度   │           │
│   │  (Can Learn) │   │  (Will Survive)│           │
│   └───────────────┘   └───────────────┘           │
│          │                  │                     │
│          ▼                  ▼                     │
│   ┌─────────────────────────────────────────┐     │
│   │          综合决策:做 / 不做 / 观察      │     │
│   └─────────────────────────────────────────┘     │
└─────────────────────────────────────────────────────┘

评估维度详解:

维度评估问题评估方法
业务契合度这个技术能解决我们业务中的哪个具体问题?解决得比现有方案好多少?痛点优先:先列出业务痛点,再找技术方案
技术成熟度有多少生产环境案例?有没有大厂背书?文档完善吗?参考 LangChain vs Spring AI 的实际落地案例数
团队学习成本团队现有技能与新技术的 gap 有多大?需要多久能掌握?估算学习曲线 vs 收益,优先选团队能快速掌握的
可替代性如果这个框架 2 年后停止维护,我们的系统能平滑迁移吗?选择核心逻辑不绑定特定框架的架构(我负责接口抽象层)
性能与成本推理延迟是否满足业务需求?Token 成本是否可接受?压测 + 成本建模
风险控制新技术引入对现有系统的稳定性有多大影响?采用"渐进式引入":先在非核心模块试点,验证稳定后再推广

我的选型原则:

核心业务逻辑用团队可控的技术(不依赖最新框架),边缘能力可以用新技术尝试。

具体来说:对话引擎(RAG、状态管理)用我们自己设计的架构,对齐 LangChain 的理念但不完全依赖其实现;工具层按需接入各家 SDK。这样即使 LangChain 停止更新,我们的核心逻辑不受影响。


3. 如何带领或协调一个团队从 0 到 1 开发一个 AI Agent 项目?在人员能力构建、开发流程、协同方式上,你认为有哪些需要特别注意的地方?

回答要点:团队领导力 + 方法论 + 具体实践

从 0 到 1 开发 AI Agent 项目的关键要点:

① 人员能力构建:

  • 分方向培养:团队内分为"AI 算法"和"工程实现"两条线,算法方向同学深入 LLM/RAG,工程方向深入 Spring AI/微服务,两条线都要懂 Agent 全流程
  • 建立知识共享机制:每周技术分享会,轮流讲一个 AI Agent 主题(Prompt 工程、RAG 调优、Guardrail 设计等)
  • 引入外部培训:对 LangChain4j、Spring AI 等新框架,安排外训或线上课程

② 开发流程设计:

Week 1-2: 需求澄清 + 技术方案设计(架构师 + 高级开发)
Week 3-4: MVP 开发(核心对话引擎 + 1-2 个工具)
Week 5:   内部测试 + Bad Case 分析
Week 6-8: 迭代优化(基于 Bad Case 持续改进)
Week 9+:  上线灰度 + 监控体系建设

③ 协同方式:

  • AI 技术特殊性:AI Agent 的输出不像传统代码那样确定性,同样 Prompt 可能每次结果不同,所以需要建立"Prompt 版本管理"(像管理代码一样管理 Prompt),所有 Prompt 变更走 Code Review
  • 数据驱动开发:建立 Eval 数据集,每个功能的迭代基于 Eval 效果评估,而非主观感觉
  • 跨职能协作:AI Agent 涉及产品(需求定义)、算法(模型调优)、工程(系统集成)、医学(知识准确性)多方协作,需要明确各方的 Definition of Done

特别注意的地方:

  1. 不要急于上 AI:先明确业务场景,用规则/传统方法能解决的就不要用 LLM,降低复杂度
  2. Prompt 即代码:所有 Prompt 要版本化管理,通过测试后才能上线
  3. 效果评估前置:在开发之初就建立 Eval 集,不要等产品做完了才发现无法评估效果
  4. 容错心态:AI Agent 有不确定性,团队需要有"拥抱不完美"的心态,同时建立快速回滚机制

4. AI Agent 的幻觉问题是落地中的一大挑战。在健康这种高严谨性领域,你们在项目中采用了哪些工程和技术手段来尽量缓解和控制幻觉?效果如何?

回答要点:完整的幻觉控制体系 + 实战效果

幻觉控制四层体系:

Layer 1:输入层——减少触发概率

// 用户输入校验:检测并拒绝模糊/危险问题
public class InputValidator {
    public ValidationResult validate(String userInput) {
        // 模糊检测:问题太宽泛时,引导用户明确
        if (ambiguityScore(userInput) > 0.7) {
            return ValidationResult.ambiguous("您的问题比较宽泛,能否具体描述一下您的症状?");
        }
        // 超出知识边界的问题直接拒答
        if (outOfScope(userInput)) {
            return ValidationResult.decline("这个问题超出了我的能力范围,建议您咨询专业医生。");
        }
        return ValidationResult.valid();
    }
}

Layer 2:检索层——确保知识来源准确

  • RAG 知识库建设(见上文"知识库构建"),减少 LLM 必须"凭记忆回答"的情况
  • 强制要求 LLM 在回答时引用检索到的文档片段(没有引用则提示"我无法确定")

Layer 3:推理层——约束 LLM 输出

// 输出结构化 + 强制引用
public String generateWithCitations(String question, List<Document> context) {
    String prompt = """
        基于以下检索到的文档片段回答问题。如果文档中没有支持某个说法,明确说"我无法确定"。
        文档:{context}
        问题:{question}
        
        要求:
        1. 每个事实性陈述后面标注[来源:文档标题]
        2. 不确定的内容说"我无法确定"
        3. 不编造药品名称、剂量、治疗方法
    """;
    return llm.generate(prompt);
}

Layer 4:验证层——双重检查高风险内容

// 高风险内容(药品剂量、诊断建议)二次验证
public class MedicalFactChecker {
    
    public FactCheckResult check(String answer, String question) {
        // 提取答案中的医学事实声明
        List<MedicalClaim> claims = extractMedicalClaims(answer);
        
        // 逐一与知识库核实
        for (MedicalClaim claim : claims) {
            if (claim.getType() == ClaimType.DOSAGE) {
                // 药品剂量声明:必须与药品数据库完全一致
                DrugPolicy policy = drugDb.getPolicy(claim.getDrug());
                if (!policy.getDosage().equals(claim.getDosage())) {
                    return FactCheckResult.fails("剂量不匹配:回答中为" + claim.getDosage() 
                        + ",实际应为" + policy.getDosage());
                }
            }
        }
        return FactCheckResult.passed();
    }
}

效果数据:

  • 幻觉率从上线初期 8%(人工抽检)降至 1.5%(持续监控)
  • 高风险医学事实错误从 3% 降至 0.2%
  • 同时保留了 LLM 的灵活性和自然语言交互体验

5. 从系统架构角度看,你认为构建一个企业级、可运维、可迭代的 AI Agent 平台,需要哪些核心的中间件或平台组件支持?(可以谈模型管理、评估平台、AB测试、数据回流等)

回答要点:平台化思维 + 组件全景图

企业级 AI Agent 平台组件全景:

┌──────────────────────────────────────────────────────────────┐
│                     用户层                                    │
│           Web / App / 第三方系统                              │
└──────────────────────────┬───────────────────────────────────┘
                           ▼
┌──────────────────────────────────────────────────────────────┐
│                    平台能力层                                  │
│                                                              │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐         │
│  │  流量管理   │  │  A/B 测试    │  │  Prompt 管理 │         │
│  │  (Gateway)  │  │  (Feature Flag)│ │ (版本化/回滚)│         │
│  └─────────────┘  └─────────────┘  └─────────────┘         │
│                                                              │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐         │
│  │  评估平台   │  │  监控告警   │  │  数据回流   │           │
│  │  (Eval Hub) │  │ (Prometheus)│  │(用户反馈→训练)│         │
│  └─────────────┘  └─────────────┘  └─────────────┘         │
└──────────────────────────┬───────────────────────────────────┘
                           ▼
┌──────────────────────────────────────────────────────────────┐
│                    模型服务层                                  │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐         │
│  │  模型网关   │  │  模型注册   │  │  模型监控   │           │
│  │(统一接入/路由)│  │(版本/回滚)  │  │(延迟/错误率)│          │
│  └─────────────┘  └─────────────┘  └─────────────┘         │
└──────────────────────────┬───────────────────────────────────┘
                           ▼
┌──────────────────────────────────────────────────────────────┐
│                    Agent 运行时                               │
│        对话引擎 / RAG Pipeline / 工具调度 / 记忆管理          │
└──────────────────────────────────────────────────────────────┘

核心组件详解:

组件职责关键技术
模型网关统一接入多个模型(OpenAI / 通义 / 本地),智能路由Envoy / 自建 API 网关
Prompt 管理平台Prompt 版本化、灰度发布、AB 测试、回滚Git-like 版本控制
评估平台(Eval Hub)管理 Eval 数据集、自动化评估、A/B 对比构建 Baseline,对比新旧版本
流量管理根据用户特征(新老/高活/高风险)分配不同 Agent 版本Feature Flag / Canary Release
数据回流管道收集用户反馈(点赞/点踩/转人工)→ 清洗 → 入评估集Kafka + 实时处理
可观测性平台全面监控(见上文第 10 题)Prometheus + Grafana + Jaeger

6. Agent 的持续学习(Continual Learning)能力。如何设计系统,使得 Agent 能够从与用户的真实交互中安全地学习并优化自身行为,而不需要频繁的全量重训?

回答要点:安全学习机制 + 不重训的增量优化思路

持续学习设计原则:

核心观点:在不重训基础模型的前提下,通过Prompt 优化、Few-shot 更新、知识库更新三种方式实现持续学习。

① 安全反馈闭环:

用户交互 → 反馈收集 → 自动标注 → 人工审核 → 知识库更新
                            ↓
                      Prompt 模板优化
// 反馈自动标注流程
@Service
public class FeedbackProcessor {
    
    public void processFeedback(String sessionId, String question, 
                                 String answer, Integer rating) {
        // 1. 自动收集(用户点赞/点踩 / 抄送给医生)
        if (rating != null && rating <= 2) {
            // 低分回答自动进入 Bad Case 库
            badCaseRepository.save(new BadCase(question, answer, rating, 
                LocalDateTime.now(), sessionId));
        }
        
        // 2. 定期人工审核(每天 20 条)
        // 3. 审核通过的 Bad Case → 更新 Few-shot 示例
        // 4. 审核通过的高质量回答 → 加入知识库
        if (isHighQualityNewPattern(question, answer)) {
            knowledgeBase.addDocument(
                new Document(question, answer, source="user_feedback")
            );
        }
    }
}

② 三层增量优化(无需重训):

优化层方式更新频率效果
Prompt 层更新 Few-shot 示例、新增指导规则按周针对特定类型问题效果显著
知识库层新增文档、更新过期内容按天扩展能力边界,不重训
工具层新增工具、优化工具描述按月扩展 Agent 能做的事

③ 约束条件:

  • 安全边界:学习过程需要人工审核,不能自动更新到生产环境
  • 可回滚:每次学习更新都有版本,支持一键回滚到上一版本
  • 渐进验证:更新先在 5% 流量验证,效果好再全量

7. 谈谈你对"多 Agent 协同"在复杂健康场景(例如,一个负责解读报告,一个负责生成膳食建议,一个负责协调日程)中应用前景的看法。这会带来哪些新的技术挑战?

回答要点:多 Agent 协同的价值 + 挑战 + 个人理解

多 Agent 协同的价值:

医疗健康场景天然适合多 Agent 协同,因为健康问题从来不是单一维度的。体检报告解读需要医学知识,膳食建议需要营养学知识,日程协调需要了解用户的生活节奏——这些能力集中在单一 Agent 里会导致模型"什么都懂一点,但什么都不精"。多 Agent 协同允许每个 Agent 专注自己的领域,通过协作完成复杂任务。

典型协作场景示例:

用户:上传了体检报告
  ↓
[报告解读 Agent] → 识别异常指标(血脂偏高、尿酸偏高)
  ↓ (传递结构化结果)
[膳食建议 Agent] → 根据异常指标生成个性化饮食方案(低嘌呤+低脂)
  ↓ (传递饮食计划)
[日程协调 Agent] → 结合用户工作安排,建议运动时间/医院复查时间
  ↓ (传递给用户)
用户:收到综合健康方案

新的技术挑战:

挑战描述应对思路
Agent 间通信协议多个 Agent 如何高效传递信息?结构化数据还是自然语言?设计标准化的 Agent 消息协议(如 JSON Schema),避免纯自然语言传递导致信息损耗
状态一致性多个 Agent 操作同一用户数据时,如何避免冲突(如报告 Agent 说血糖高,膳食 Agent 说吃甜食)?引入"健康状态中心",统一管理用户当前健康状态,所有 Agent 读写前先查状态
协调调度多个 Agent 的执行顺序如何确定?串行还是并行?出错时如何回滚?设计 Orchestrator(编排器)统一调度,使用状态机管理协作流程
可解释性当最终建议有问题时,如何追溯是哪个 Agent 出错了?每个 Agent 的输入/输出/决策都要完整记录(链路追踪),支持逐层排查
资源消耗多个 Agent 串联意味着 Token 消耗成倍增长优化 Agent 间信息传递(传递摘要而非全文),设置最大调用深度限制
隐私合规健康数据在多个 Agent 间流转,安全边界如何保障?每个 Agent 只能访问其职责所需的最少数据(最小权限原则)

8. 你个人如何保持对 LLM、AI Agent 领域快速发展的技术敏感度和学习节奏?最近半年,最让你感到兴奋或认为有颠覆性潜力的相关技术、论文或开源项目是什么?

回答要点:学习方法和视野 + 具体技术举例

我的技术敏感度保持方法:

  1. 信息源精选:

    • 每日:Hugging Face Daily Papers、ArXiv cs.CL 最新论文摘要
    • 每周:Lex Fridman Podcast(AI 方向)、The Batch(吴恩达)
    • 每月:深入读 1-2 篇核心技术论文(而非只看摘要)
  2. 动手实践:

    • 任何新技术我都会在周末跑一个 Mini POC(30 分钟的小实验)
    • 将实验结果写成笔记(Obsidian 知识库)而非只存在脑子里
  3. 社区参与:

    • 参与 LangChain4j、Spring AI 的 GitHub Issue 讨论(提问题 + 看别人怎么解决问题)
    • 在 CSDN 写技术文章(写的过程是最好的学习)

最近最让我兴奋的技术方向:

  1. OpenClaw(龙虾):

    Peter Steinberger 的开源项目,2 天 10 万 Star 的记录背后是真正的工程创新——Gateway + WebSocket 架构让 AI Agent 的部署门槛大幅降低,Canvas 可视化和飞书/微信原生支持让 AI 从"极客玩具"变成"普通人的生产力工具"。我认为这类"让 AI Agent 普惠化"的工具会是 2026 年的重要趋势。

  2. MiMo(大模型):

    小米的开源大模型,在中文场景下的性价比极高,配合百万亿 Token 激励计划,为开发者提供了极低成本的 AI 应用开发基础。我认为 AI Agent + 垂直领域的结合(医疗/法律/教育)会诞生大量机会。

  3. RAG + Knowledge Graph 融合:

    传统向量 RAG 的局限在于"语义相似但事实可能矛盾",结合知识图谱的精确关系推理可以大幅提升准确性。这在医疗场景特别有价值,因为医学知识的精确性要求远比一般问答场景高。

  4. Function Calling 标准化:

    Anthropic、OpenAI、阿里都推出了 Function Calling 规范,标准化后会让多工具协同的 Agent 开发成本大幅降低,不同模型之间可以无缝切换。


附录:面试准备资源

核心参考文档

  • Spring AI 官方文档:https://docs.spring.io/spring-ai/reference/
  • LangChain4j 官方文档:https://docs.langchain4j.com/
  • 京东健康 Agent 技术实践(内部 Wiki)

推荐阅读论文

  • “ReAct: Synergizing Reasoning and Acting in Language Models”(SyLVester et al., 2023)
  • “Tree of Thoughts: Deliberate Problem Solving with Large Language Models”(Yao et al., 2023)
  • “Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks”(Lewis et al., 2020)
  • “Guardrails for Safe AI in Healthcare”(Anthropic Safety Guide)

推荐实践项目

  • 构建一个健康管理 Agent(覆盖 RAG、多轮对话、Tool Calling)
  • 参与开源社区(LangChain4j / Spring AI 贡献)
  • 在 CSDN 写 AI Agent 实战文章(教学相长)

文档版本:v1.0
维护者:xiaoyuer
更新日期:2026-05-15

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐