JBoltAI 框架完整实操案例 在 Java 生态中快速构建大模型应用全流程实战指南

简介: 本案例基于JBoltAI框架,展示如何快速构建Java生态中的大模型应用——智能客服系统。系统面向电商平台,具备自动回答常见问题、意图识别、多轮对话理解及复杂问题转接人工等功能。采用Spring Boot+JBoltAI架构,集成向量数据库与大模型(如文心一言或通义千问)。内容涵盖需求分析、环境搭建、代码实现(知识库管理、核心服务、REST API)、前端界面开发及部署测试全流程,助你高效掌握大模型应用开发。

下面为你提供一个基于JBoltAI框架的完整实操案例,帮助你理解如何在Java生态中快速构建大模型应用。这个案例将展示如何利用JBoltAI实现一个智能客服系统,包括需求分析、环境搭建、代码实现和部署测试等环节。

基于JBoltAI的智能客服系统实现

1. 需求分析与方案设计

我们要构建一个面向电商平台的智能客服系统,具备以下功能:

  • 自动回答常见问题(如订单查询、物流追踪、退换货政策)
  • 识别用户意图并提供精准回答
  • 支持多轮对话上下文理解
  • 复杂问题自动转接人工客服

系统架构设计:

  • 前端:HTML+JavaScript界面
  • 后端:Spring Boot + JBoltAI框架
  • 知识库:采用向量数据库存储常见问题和答案
  • 大模型:集成文心一言或通义千问(可根据需要切换)

2. 环境搭建

首先,创建一个新的Spring Boot项目,添加JBoltAI依赖。在pom.xml中添加以下内容:

<dependencies>
    <!-- Spring Boot 基础依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- JBoltAI 核心依赖 -->
    <dependency>
        <groupId>com.jbolt</groupId>
        <artifactId>jbolt-ai-spring-boot-starter</artifactId>
        <version>2.0.5</version>
    </dependency>

    <!-- 向量数据库依赖 -->
    <dependency>
        <groupId>com.zilliz</groupId>
        <artifactId>milvus-sdk-java</artifactId>
        <version>2.3.5</version>
    </dependency>
</dependencies>

3. 配置大模型服务

application.yml中配置大模型服务信息:

jbolt:
  ai:
    enabled: true
    model:
      type: wenxin # 可选择 wenxin、tongyi、openai 等
      wenxin:
        api-key: your-wenxin-api-key
        secret-key: your-wenxin-secret-key
        base-url: https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions
    vector-db:
      enabled: true
      type: milvus
      milvus:
        host: localhost
        port: 19530
        database: default
        collection-name: faq_embeddings

4. 构建知识库管理模块

创建知识库实体类:

package com.example.demo.entity;

import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.IBean;

/**
 * 知识库实体类,存储常见问题和答案
 */
public class KnowledgeBase extends Model<KnowledgeBase> implements IBean {
   
    private static final long serialVersionUID = 1L;

    public static final KnowledgeBase dao = new KnowledgeBase().dao();

    // 问题
    public String getQuestion() {
   
        return getStr("question");
    }

    public void setQuestion(String question) {
   
        set("question", question);
    }

    // 答案
    public String getAnswer() {
   
        return getStr("answer");
    }

    public void setAnswer(String answer) {
   
        set("answer", answer);
    }

    // 分类
    public String getCategory() {
   
        return getStr("category");
    }

    public void setCategory(String category) {
   
        set("category", category);
    }

    // 向量表示(由大模型生成)
    public byte[] getEmbedding() {
   
        return getBytes("embedding");
    }

    public void setEmbedding(byte[] embedding) {
   
        set("embedding", embedding);
    }
}

5. 实现智能客服核心服务

创建客服服务类,处理用户提问并生成回答:

package com.example.demo.service;

import com.example.demo.entity.KnowledgeBase;
import com.jbolt.ai.LLMService;
import com.jbolt.ai.embedding.EmbeddingResult;
import com.jbolt.ai.vectorstore.VectorStore;
import com.jbolt.ai.vectorstore.VectorStoreQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * 智能客服核心服务
 */
@Service
public class CustomerService {
   

    @Autowired
    private LLMService llmService;

    @Autowired
    private VectorStore vectorStore;

    /**
     * 处理用户提问并生成回答
     */
    public String handleQuestion(String question, List<Map<String, String>> conversationHistory) {
   
        // 1. 将用户问题转换为向量表示
        EmbeddingResult embeddingResult = llmService.createEmbedding(question);
        float[] embedding = embeddingResult.getEmbeddings().get(0);

        // 2. 在知识库中查找相似问题
        VectorStoreQuery query = new VectorStoreQuery();
        query.setEmbedding(embedding);
        query.setTopK(3); // 返回最相似的3个问题
        List<Map<String, Object>> similarQuestions = vectorStore.similaritySearch(query);

        // 3. 构建提示模板,包含用户问题、历史对话和相似问题
        StringBuilder prompt = new StringBuilder();
        prompt.append("你是一个电商平台的智能客服,擅长回答用户关于订单、物流、商品和售后的问题。\n\n");

        // 添加历史对话
        if (conversationHistory != null && !conversationHistory.isEmpty()) {
   
            prompt.append("历史对话:\n");
            for (Map<String, String> message : conversationHistory) {
   
                prompt.append("用户: ").append(message.get("user")).append("\n");
                prompt.append("客服: ").append(message.get("assistant")).append("\n");
            }
            prompt.append("\n");
        }

        // 添加相似问题和答案作为参考
        if (!similarQuestions.isEmpty()) {
   
            prompt.append("参考问题和答案:\n");
            for (Map<String, Object> item : similarQuestions) {
   
                String similarQuestion = (String) item.get("question");
                String similarAnswer = (String) item.get("answer");
                prompt.append("问题: ").append(similarQuestion).append("\n");
                prompt.append("答案: ").append(similarAnswer).append("\n\n");
            }
        }

        // 添加用户当前问题
        prompt.append("用户当前问题: ").append(question);

        // 4. 调用大模型生成回答
        String answer = llmService.generateText(prompt.toString());

        // 5. 分析回答是否需要转接人工客服
        if (needHumanSupport(answer)) {
   
            return "很抱歉,您的问题比较复杂,我将为您转接人工客服,请稍候...";
        }

        return answer;
    }

    /**
     * 判断是否需要转接人工客服
     */
    private boolean needHumanSupport(String answer) {
   
        // 简单实现,实际应用中可以使用更复杂的判断逻辑
        return answer.contains("转接人工客服") || 
               answer.contains("无法回答") || 
               answer.contains("请联系客服");
    }

    /**
     * 更新知识库
     */
    public void updateKnowledgeBase(String question, String answer, String category) {
   
        // 1. 生成问题的向量表示
        EmbeddingResult embeddingResult = llmService.createEmbedding(question);
        float[] embedding = embeddingResult.getEmbeddings().get(0);

        // 2. 将向量转换为字节数组存储
        byte[] embeddingBytes = new byte[embedding.length * 4];
        for (int i = 0; i < embedding.length; i++) {
   
            int bits = Float.floatToIntBits(embedding[i]);
            embeddingBytes[i * 4] = (byte) (bits & 0xff);
            embeddingBytes[i * 4 + 1] = (byte) ((bits >> 8) & 0xff);
            embeddingBytes[i * 4 + 2] = (byte) ((bits >> 16) & 0xff);
            embeddingBytes[i * 4 + 3] = (byte) ((bits >> 24) & 0xff);
        }

        // 3. 保存到知识库
        KnowledgeBase kb = new KnowledgeBase();
        kb.setQuestion(question);
        kb.setAnswer(answer);
        kb.setCategory(category);
        kb.setEmbedding(embeddingBytes);
        kb.save();

        // 4. 同时更新向量数据库
        Map<String, Object> metadata = new HashMap<>();
        metadata.put("question", question);
        metadata.put("answer", answer);
        metadata.put("category", category);
        vectorStore.addEmbedding(embedding, metadata);
    }
}

6. 创建REST API接口

创建控制器类,提供对外服务接口:

package com.example.demo.controller;

import com.example.demo.service.CustomerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 智能客服API接口
 */
@RestController
@RequestMapping("/api/customer-service")
public class CustomerServiceController {
   

    @Autowired
    private CustomerService customerService;

    // 存储会话历史,实际应用中应使用Redis等分布式缓存
    private Map<String, List<Map<String, String>>> conversationHistoryMap = new HashMap<>();

    /**
     * 处理用户提问
     */
    @PostMapping("/ask")
    public Map<String, Object> askQuestion(@RequestBody Map<String, String> request) {
   
        String userId = request.get("userId");
        String question = request.get("question");

        // 获取会话历史
        List<Map<String, String>> conversationHistory = conversationHistoryMap.computeIfAbsent(
                userId, k -> new ArrayList<>());

        // 调用客服服务处理问题
        String answer = customerService.handleQuestion(question, conversationHistory);

        // 保存对话历史
        Map<String, String> userMessage = new HashMap<>();
        userMessage.put("user", question);
        userMessage.put("assistant", answer);
        conversationHistory.add(userMessage);

        // 返回结果
        Map<String, Object> result = new HashMap<>();
        result.put("answer", answer);
        result.put("conversationId", userId);
        result.put("timestamp", System.currentTimeMillis());

        return result;
    }

    /**
     * 更新知识库
     */
    @PostMapping("/knowledge-base")
    public Map<String, Object> updateKnowledgeBase(@RequestBody Map<String, String> request) {
   
        String question = request.get("question");
        String answer = request.get("answer");
        String category = request.get("category");

        customerService.updateKnowledgeBase(question, answer, category);

        Map<String, Object> result = new HashMap<>();
        result.put("success", true);
        result.put("message", "知识库更新成功");

        return result;
    }
}

7. 前端界面实现

创建一个简单的HTML页面,实现与后端的交互:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>智能客服系统</title>
    <script src="https://cdn.tailwindcss.com"></script>
    <link href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css" rel="stylesheet">

    <script>
        tailwind.config = {
    
            theme: {
    
                extend: {
    
                    colors: {
    
                        primary: '#165DFF',
                        secondary: '#00B42A',
                        neutral: '#F5F7FA',
                        dark: '#1D2129',
                    },
                    fontFamily: {
    
                        sans: ['Inter', 'system-ui', 'sans-serif'],
                    },
                }
            }
        }
    </script>

    <style type="text/tailwindcss">
        @layer utilities {
    
            .content-auto {
    
                content-visibility: auto;
            }
            .chat-bubble-user {
    
                @apply bg-primary text-white rounded-tl-lg rounded-tr-2xl rounded-br-2xl;
            }
            .chat-bubble-bot {
    
                @apply bg-neutral text-dark rounded-tl-2xl rounded-tr-2xl rounded-bl-2xl;
            }
            .typing-indicator {
    
                @apply inline-flex space-x-1;
            }
            .typing-indicator span {
    
                @apply w-2 h-2 bg-gray-400 rounded-full animate-bounce;
            }
            .typing-indicator span:nth-child(2) {
    
                @apply animate-bounce delay-100;
            }
            .typing-indicator span:nth-child(3) {
    
                @apply animate-bounce delay-200;
            }
        }
    </style>
</head>
<body class="bg-gray-50 font-sans">
    <div class="min-h-screen flex flex-col">
        <!-- 顶部导航 -->
        <header class="bg-white shadow-sm sticky top-0 z-10">
            <div class="container mx-auto px-4 py-3 flex items-center justify-between">
                <div class="flex items-center space-x-2">
                    <i class="fa fa-comments text-primary text-2xl"></i>
                    <h1 class="text-xl font-bold text-dark">智能客服助手</h1>
                </div>
                <div class="flex items-center space-x-4">
                    <button id="toggle-theme" class="text-gray-500 hover:text-primary transition-colors">
                        <i class="fa fa-moon-o"></i>
                    </button>
                    <button id="btn-help" class="text-gray-500 hover:text-primary transition-colors">
                        <i class="fa fa-question-circle"></i>
                    </button>
                </div>
            </div>
        </header>

        <!-- 主内容区 -->
        <main class="flex-grow container mx-auto px-4 py-6 flex flex-col lg:flex-row gap-6">
            <!-- 左侧知识库面板 -->
            <aside class="lg:w-1/4 bg-white rounded-xl shadow-sm p-4 hidden lg:block">
                <h2 class="text-lg font-semibold mb-4 flex items-center">
                    <i class="fa fa-book text-primary mr-2"></i>常见问题
                </h2>
                <div class="space-y-2">
                    <div class="faq-item p-3 rounded-lg bg-neutral hover:bg-gray-200 cursor-pointer transition-colors">
                        <h3 class="font-medium">如何查询我的订单状态?</h3>
                        <p class="text-sm text-gray-600 mt-1">您可以在"我的订单"页面查看所有订单的当前状态...</p>
                    </div>
                    <div class="faq-item p-3 rounded-lg bg-neutral hover:bg-gray-200 cursor-pointer transition-colors">
                        <h3 class="font-medium">如何申请退换货?</h3>
                        <p class="text-sm text-gray-600 mt-1">在订单完成后7天内,您可以在订单详情页申请退换货...</p>
                    </div>
                    <div class="faq-item p-3 rounded-lg bg-neutral hover:bg-gray-200 cursor-pointer transition-colors">
                        <h3 class="font-medium">如何修改收货地址?</h3>
                        <p class="text-sm text-gray-600 mt-1">在订单发货前,您可以在订单详情页修改收货地址...</p>
                    </div>
                    <div class="faq-item p-3 rounded-lg bg-neutral hover:bg-gray-200 cursor-pointer transition-colors">
                        <h3 class="font-medium">支付方式有哪些?</h3>
                        <p class="text-sm text-gray-600 mt-1">我们支持微信支付、支付宝、银行卡等多种支付方式...</p>
                    </div>
                </div>

                <h2 class="text-lg font-semibold mt-6 mb-4 flex items-center">
                    <i class="fa fa-folder text-primary mr-2"></i>问题分类
                </h2>
                <div class="space-y-1">
                    <button class="w-full text-left p-2 rounded-lg hover:bg-neutral transition-colors">
                        <i class="fa fa-shopping-cart mr-2"></i>订单相关
                    </button>
                    <button class="w-full text-left p-2 rounded-lg hover:bg-neutral transition-colors">
                        <i class="fa fa-truck mr-2"></i>物流配送
                    </button>
                    <button class="w-full text-left p-2 rounded-lg hover:bg-neutral transition-colors">
                        <i class="fa fa-credit-card mr-2"></i>支付方式
                    </button>
                    <button class="w-full text-left p-2 rounded-lg hover:bg-neutral transition-colors">
                        <i class="fa fa-refresh mr-2"></i>退换货政策
                    </button>
                    <button class="w-full text-left p-2 rounded-lg hover:bg-neutral transition-colors">
                        <i class="fa fa-user mr-2"></i>账户管理
                    </button>
                </div>
            </aside>

            <!-- 中间聊天区域 -->
            <section class="lg:w-2/4 bg-white rounded-xl shadow-sm flex flex-col h-[80vh] overflow-hidden">
                <div class="p-4 border-b border-gray-200">
                    <h2 class="text-lg font-semibold">在线客服</h2>
                    <p class="text-sm text-gray-500">工作时间: 9:00-21:00 (周一至周日)</p>
                </div>

                <div id="chat-container" class="flex-grow p-4 overflow-y-auto space-y-4">
                    <!-- 欢迎消息 -->
                    <div class="flex items-start space-x-3">
                        <div class="w-8 h-8 rounded-full bg-primary/20 flex items-center justify-center text-primary">
                            <i class="fa fa-robot"></i>
                        </div>
                        <div class="max-w-[80%]">
                            <div class="chat-bubble-bot p-3">
                                <p>您好!我是智能客服助手,很高兴为您服务。请问有什么可以帮助您的吗?</p>
                            </div>
                            <div class="text-xs text-gray-500 mt-1">刚刚</div>
                        </div>
                    </div>
                </div>

                <div class="p-4 border-t border-gray-200">
                    <div class="relative">
                        <textarea id="user-input" rows="3" placeholder="请输入您的问题..." 
                            class="w-full p-3 pr-12 rounded-lg border border-gray-300 focus:outline-none focus:ring-2 focus:ring-primary/50 focus:border-primary transition-all resize-none"></textarea>
                        <button id="send-button" class="absolute right-3 bottom-3 text-primary hover:text-primary/80 transition-colors">
                            <i class="fa fa-paper-plane text-xl"></i>
                        </button>
                    </div>
                    <div class="flex justify-between mt-2 text-sm">
                        <div class="text-gray-500">
                            <i class="fa fa-info-circle mr-1"></i>输入"转接人工"可转人工客服
                        </div>
                        <div class="text-gray-500">
                            <i class="fa fa-star mr-1"></i>评价客服
                        </div>
                    </div>
                </div>
            </section>

            <!-- 右侧客服信息面板 -->
            <aside class="lg:w-1/4 bg-white rounded-xl shadow-sm p-4 hidden lg:block">
                <h2 class="text-lg font-semibold mb-4 flex items-center">
                    <i class="fa fa-info-circle text-primary mr-2"></i>客服信息
                </h2>

                <div class="bg-neutral rounded-lg p-4 mb-4">
                    <div class="flex items-center space-x-3">
                        <div class="w-12 h-12 rounded-full bg-primary/20 flex items-center justify-center text-primary">
                            <i class="fa fa-robot text-xl"></i>
                        </div>
                        <div>
                            <h3 class="font-medium">智能客服助手</h3>
                            <p class="text-xs text-gray-500">随时为您服务</p>
                        </div>
                    </div>

                    <div class="mt-3">
                        <p class="text-sm">我可以回答您关于订单、物流、支付和退换货等方面的问题。</p>
                        <p class="text-sm mt-1">如果我无法解答,将为您转接人工客服。</p>
                    </div>
                </div>

                <h2 class="text-lg font-semibold mb-4 flex items-center">
                    <i class="fa fa-line-chart text-primary mr-2"></i>服务数据
                </h2>

                <div class="space-y-3">
                    <div>
                        <div class="flex justify-between text-sm mb-1">
                            <span>响应速度</span>
                            <span>98%</span>
                        </div>
                        <div class="w-full bg-gray-200 rounded-full h-2">
                            <div class="bg-primary h-2 rounded-full" style="width: 98%"></div>
                        </div>
                    </div>

                    <div>
                        <div class="flex justify-between text-sm mb-1">
                            <span>问题解决率</span>
                            <span>95%</span>
                        </div>
                        <div class="w-full bg-gray-200 rounded-full h-2">
                            <div class="bg-secondary h-2 rounded-full" style="width: 95%"></div>
                        </div>
                    </div>

                    <div>
                        <div class="flex justify-between text-sm mb-1">
                            <span>用户满意度</span>
                            <span>97%</span>
                        </div>
                        <div class="w-full bg-gray-200 rounded-full h-2">
                            <div class="bg-yellow-500 h-2 rounded-full" style="width: 97%"></div>
                        </div>
                    </div>
                </div>

                <h2 class="text-lg font-semibold mt-6 mb-4 flex items-center">
                    <i class="fa fa-headphones text-primary mr-2"></i>其他联系方式
                </h2>

                <div class="space-y-2">
                    <a href="#" class="flex items-center p-2 rounded-lg hover:bg-neutral transition-colors">
                        <i class="fa fa-phone text-primary mr-2"></i>
                        <span>400-123-4567</span>
                    </a>
                    <a href="#" class="flex items-center p-2 rounded-lg hover:bg-neutral transition-colors">
                        <i class="fa fa-envelope text-primary mr-2"></i>
                        <span>support@example.com</span>
                    </a>
                    <a href="#" class="flex items-center p-2 rounded-lg hover:bg-neutral transition-colors">
                        <i class="fa fa-weixin text-primary mr-2"></i>
                        <span>关注公众号:客服小助手</span>
                    </a>
                </div>
            </aside>
        </main>

        <!-- 底部 -->
        <footer class="bg-white border-t border-gray-200 py-4">
            <div class="container mx-auto px-4 text-center text-sm text-gray-500">
                <p>© 2025 智能客服系统 | 隐私政策 | 使用条款</p>
            </div>
        </footer>
    </div>

    <script>
        document.addEventListener('DOMContentLoaded', function() {
    
            const chatContainer = document.getElementById('chat-container');
            const userInput = document.getElementById('user-input');
            const sendButton = document.getElementById('send-button');
            const toggleTheme = document.getElementById('toggle-theme');

            // 生成唯一用户ID
            const userId = Math.random().toString(36).substring(2, 15);

            // 发送消息
            function sendMessage() {
    
                const message = userInput.value.trim();
                if (!message) return;

                // 添加用户消息到聊天界面
                addUserMessage(message);

                // 清空输入框
                userInput.value = '';

                // 显示"正在输入"状态
                showTypingIndicator();

                // 发送消息到服务器
                fetch('/api/customer-service/ask', {
    
                    method: 'POST',
                    headers: {
    
                        'Content-Type': 'application/json'
                    },
                    body: JSON.stringify({
    
                        userId: userId,
                        question: message
                    })
                })
                .then(response => response.json())
                .then(data => {
    
                    // 移除"正在输入"状态
                    removeTypingIndicator();

                    // 添加AI回复到聊天界面
                    addBotMessage(data.answer);
                })
                .catch(error => {
    
                    console.error('Error:', error);
                    removeTypingIndicator();
                    addBotMessage('抱歉,发生了错误,请稍后再试。');
                });
            }

            // 添加用户消息到聊天界面
            function addUserMessage(message) {
    
                const now = new Date();
                const timeString = now.getHours() + ':' + (now.getMinutes() < 10 ? '0' : '') + now.getMinutes();

                const userMessageHtml = `
                    <div class="flex items-start justify-end space-x-3">
                        <div class="max-w-[80%]">
                            <div class="chat-bubble-user p-3">
                                <p>${
      message}</p>
                            </div>
                            <div class="text-xs text-gray-500 mt-1 text-right">${
      timeString}</div>
                        </div>
                        <div class="w-8 h-8 rounded-full bg-gray-200 flex items-center justify-center">
                            <i class="fa fa-user text-gray-500"></i>
                        </div>
                    </div>
                `;

                chatContainer.insertAdjacentHTML('beforeend', userMessageHtml);
                chatContainer.scrollTop = chatContainer.scrollHeight;
            }

            // 添加AI回复到聊天界面
            function addBotMessage(message) {
    
                const now = new Date();
                const timeString = now.getHours() + ':' + (now.getMinutes() < 10 ? '0' : '') + now.getMinutes();

                const botMessageHtml = `
                    <div class="flex items-start space-x-3">
                        <div class="w-8 h-8 rounded-full bg-primary/20 flex items-center justify-center text-primary">
                            <i class="fa fa-robot"></i>
                        </div>
                        <div class="max-w-[80%]">
                            <div class="chat-bubble-bot p-3">
                                <p>${
      message}</p>
                            </div>
                            <div class="text-xs text-gray-500 mt-1">${
      timeString}</div>
                        </div>
                    </div>
                `;

                chatContainer.insertAdjacentHTML('beforeend', botMessageHtml);
                chatContainer.scrollTop = chatContainer.scrollHeight;
            }

            // 显示"正在输入"状态
            function showTypingIndicator() {
    
                const typingHtml = `
                    <div id="typing-indicator" class="flex items-start space-x-3">
                        <div class="w-8 h-8 rounded-full bg-primary/20 flex items-center justify-center text-primary">
                            <i class="fa fa-robot"></i>
                        </div>
                        <div class="max-w-[80%]">
                            <div class="chat-bubble-bot p-3">
                                <div class="typing-indicator">
                                    <span></span>
                                    <span></span>
                                    <span></span>
                                </div>
                            </div>
                        </div>
                    </div>
                `;

                chatContainer.insertAdjacentHTML('beforeend', typingHtml);
                chatContainer.scrollTop = chatContainer.scrollHeight;
            }

            // 移除"正在输入"状态
            function removeTypingIndicator() {
    
                const typingIndicator = document.getElementById('typing-indicator');
                if (typingIndicator) {
    
                    typingIndicator.remove();
                }
            }

            // 绑定发送按钮点击事件
            sendButton.addEventListener('click', sendMessage);

            // 绑定回车键发送消息
            userInput.addEventListener('keydown', function(event) {
    
                if (event.key === 'Enter' && !event.shiftKey) {
    
                    event.preventDefault();
                    sendMessage();
                }
            });

            // 切换主题
            toggleTheme.addEventListener('click', function() {
    
                document.body.classList.toggle('dark');
                const icon = toggleTheme.querySelector('i');
                if (icon.classList.contains('fa-moon-o')) {
    
                    icon.classList.remove('fa-moon-o');
                    icon.classList.add('fa-sun-o');
                } else {
    
                    icon.classList.remove('fa-sun-o');
                    icon.classList.add('fa-moon-o');
                }
            });

            // 知识库项目点击事件
            document.querySelectorAll('.faq-item').forEach(item => {
    
                item.addEventListener('click', function() {
    
                    const question = this.querySelector('h3').textContent;
                    userInput.value = question;
                    sendMessage();
                });
            });
        });
    </script>
</body>
</html>

8. 系统部署与测试

首先,确保你已经安装了以下环境:

  • JDK 17+
  • Maven 3.8+
  • Docker(可选,用于部署向量数据库)

部署步骤:

  1. 启动向量数据库(以Milvus为例):
# 使用Docker启动Milvus轻量版
docker run -d --name milvus-lite -p 19530:19530 -p 9091:9091 milvusdb/milvus:2.3.5-lite
  1. 配置大模型API密钥:
    application.yml中填写你选择的大模型的API密钥。

  2. 启动Spring Boot应用:

mvn spring-boot:run
  1. 访问前端界面:
    打开浏览器,访问http://localhost:8080即可看到智能客服界面。

测试场景:

  • 尝试输入常见问题,如"如何查询订单状态?"
  • 测试多轮对话,如"我的订单号是123456,现在状态如何?"
  • 输入复杂问题,触发转接人工客服流程

通过以上步骤,你就成功实现了一个基于JBoltAI框架的智能客服系统。这个系统可以根据企业需求进一步扩展,如添加更多知识库、集成更多大模型、优化对话流程等。


JBoltAI,AI 框架,大



代码获取方式
https://pan.quark.cn/s/14fcf913bae6


相关文章
|
3天前
|
人工智能 自然语言处理 API
构建可落地的企业AI Agent,背后隐藏着怎样的技术密码?
三桥君深入解析企业AI Agent技术架构,涵盖语音识别、意图理解、知识库协同、语音合成等核心模块,探讨如何实现业务闭环与高效人机交互,助力企业智能化升级。
51 6
|
4天前
|
人工智能 前端开发 机器人
10+热门 AI Agent 框架深度解析:谁更适合你的项目?
选型Agent框架不等于追热门!要选真正能跑得稳、适配团队能力与业务需求的框架。架构选错,轻则性能差,重则项目难推进。本文详解10大热门框架对比、5大新兴框架推荐及四步选型法,助你高效落地AI应用。
|
5天前
|
人工智能 Cloud Native Java
2025 年 Java 应届生斩获高薪需掌握的技术实操指南与实战要点解析
本指南为2025年Java应届生打造,涵盖JVM调优、响应式编程、云原生、微服务、实时计算与AI部署等前沿技术,结合电商、数据处理等真实场景,提供可落地的技术实操方案,助力掌握高薪开发技能。
42 2
|
5天前
|
缓存 Java API
Java 面试实操指南与最新技术结合的实战攻略
本指南涵盖Java 17+新特性、Spring Boot 3微服务、响应式编程、容器化部署与数据缓存实操,结合代码案例解析高频面试技术点,助你掌握最新Java技术栈,提升实战能力,轻松应对Java中高级岗位面试。
31 0
|
6天前
|
人工智能 分布式计算 DataWorks
阿里云ODPS多模态数据处理实战:MaxFrame的分布式AI数据管道构建
初次接触MaxCompute时,我被其强大的分布式计算能力所震撼,但真正让我深度依赖这套生态的转折点,是在一次处理百万级图像数据集的项目中。当时我们面临的挑战是如何在有限的时间内完成大规模图像特征提取和模型训练,传统的单机处理方案显然无法胜任。经过深入调研,我们选择了MaxCompute的Object Table功能来管理非结构化数据,配合MaxFrame进行分布式计算,整个处理流程的效率提升了300%以上。 在随后的几年实践中,我逐渐发现ODPS不仅仅是一个大数据处理平台,更是一个完整的数据生态系统。从DataWorks的可视化开发环境,到Hologres的实时查询能力,再到MaxCompu
54 3
阿里云ODPS多模态数据处理实战:MaxFrame的分布式AI数据管道构建
|
2天前
|
缓存 安全 前端开发
Java 核心知识点与实战应用解析
我梳理的这些内容涵盖了 Java 众多核心知识点。包括 final 关键字的作用(修饰类、方法、变量的特性);重载与重写的区别;反射机制的定义、优缺点及项目中的应用(如结合自定义注解处理数据、框架底层实现)。 还涉及 String、StringBuffer、StringBuilder 的差异;常见集合类及线程安全类,ArrayList 与 LinkedList 的区别;HashMap 的实现原理、put 流程、扩容机制,以及 ConcurrentHashMap 的底层实现。 线程相关知识中,创建线程的四种方式,Runnable 与 Callable 的区别,加锁方式(synchronize
|
3天前
|
存储 安全 Java
从基础语法到实战应用的 Java 入门必备知识全解析
本文介绍了Java入门必备知识,涵盖开发环境搭建、基础语法、面向对象编程、集合框架、异常处理、多线程和IO流等内容,结合实例帮助新手快速掌握Java核心概念与应用技巧。
16 0
|
8天前
|
人工智能 自然语言处理 网络安全
云上玩转Qwen3系列之四:构建AI Search RAG全栈应用
本文介绍如何利用人工智能平台 PAI-LangStudio、Qwen3 大模型与 AI 搜索开放平台结合 Elasticsearch,构建高效、精准的 AI Search RAG 智能检索应用。通过混合检索技术及 Agentic Workflow 编排,实现自然语言驱动的精准查询,并支持灵活扩展与二次开发,满足多样化场景需求。
|
SQL Java 数据库连接
Java面试题日积月累(SSM框架面试题22道)
Java面试题日积月累(SSM框架面试题22道)
204 0
|
设计模式 存储 安全
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
125 1