Java大语言模型开发生态:主流框架技术对比与实践

### Java大语言模型开发生态:主流框架技术对比与实践


在大语言模型应用开发领域,Java生态系统提供了多种开发框架选择。从功能完备的Spring AI到轻量灵活的Agents-Flex,这些框架为Java开发者构建智能应用提供了有力支持。


#### 大语言模型开发框架概览


**主流框架技术特点**

- Spring AI:Spring生态集成,功能全面

- LangChain4j:灵感来自Python LangChain,链式调用

- Agents-Flex:国产框架,注重灵活性和性能

- Haystack:面向生产环境的搜索增强生成


**项目依赖配置**

```xml

    0.8.1

    0.29.1


   

   

        org.springframework.ai

        spring-ai-openai-spring-boot-starter

        ${spring-ai.version}

   

    

   

   

        dev.langchain4j

        langchain4j-open-ai

        ${langchain4j.version}

   

<"ei.basketball.zqbty.cn">

<"movie.basketball.zqbty.cn">

<"live.basketball.zqbty.cn">

    

   

   

        com.agents-flex

        agents-flex-core

        0.1.0

   

```


#### Spring AI框架深度解析


**基础配置与初始化**

```java

@Configuration

@EnableAiServices

public class OpenAIConfig {

    

    @Value("${spring.ai.openai.api-key}")

    private String openaiApiKey;

    

    @Bean

    public OpenAiChatClient openAiChatClient() {

        OpenAiChatOptions options = OpenAiChatOptions.builder()

            .withModel("gpt-3.5-turbo")

            .withTemperature(0.7)

            .withMaxTokens(1000)

            .build();

            

        OpenAiApi openAiApi = new OpenAiApi(openaiApiKey);

        return new OpenAiChatClient(openAiApi, options);

    }

<"sport.basketball.zqbty.cn">

<"football.basketball.zqbty.cn">

<"www.football.zqbty.cn">

}

```


**聊天服务实现**

```java

@Service

public class ChatService {

    

    private final OpenAiChatClient chatClient;

    

    public ChatService(OpenAiChatClient chatClient) {

        this.chatClient = chatClient;

    }

    

    public String generateResponse(String userMessage) {

        Prompt prompt = new Prompt(userMessage);

        ChatResponse response = chatClient.call(prompt);

        return response.getResult().getOutput().getContent();

    }

    

    public AiResponse processUserQuery(UserQuery query) {

        String systemPrompt = """

            你是一个专业的客服助手,请根据用户问题提供准确、有帮助的回答。

            回答要简洁明了,重点突出。

            """;

            

        PromptTemplate promptTemplate = new PromptTemplate("""

            {systemPrompt}

            

            用户问题:{userQuestion}

            用户上下文:{userContext}

            """);

<"wap.football.zqbty.cn">

<"m.football.zqbty.cn">

<"share.football.zqbty.cn">

            

        Map variables = Map.of(

            "systemPrompt", systemPrompt,

            "userQuestion", query.getQuestion(),

            "userContext", query.getContext()

        );

        

        Prompt prompt = promptTemplate.create(variables);

        ChatResponse response = chatClient.call(prompt);

        

        return new AiResponse(

            response.getResult().getOutput().getContent(),

            response.getMetadata().getUsage().getTotalTokens()

        );

    }

}

```


#### LangChain4j应用实践


**链式调用模式**

```java

@Slf4j

public class CustomerServiceAgent {

    

    private final ChatLanguageModel chatModel;

    private final ConversationMemory memory;

    

    public CustomerServiceAgent() {

        this.chatModel = OpenAiChatModel.builder()

            .apiKey(System.getenv("OPENAI_API_KEY"))

            .modelName("gpt-3.5-turbo")

            .temperature(0.7)

            .maxTokens(1000)

            .build();

<"ei.football.zqbty.cn">

<"movie.football.zqbty.cn">

<"live.football.zqbty.cn">

            

        this.memory = MessageWindowChatMemory.withMaxMessages(10);

    }

    

    public String handleCustomerInquiry(String userMessage) {

        // 构建系统提示词

        String systemMessage = """

            你是一个电商客服助手,专门处理用户咨询。

            请根据对话历史提供连贯、准确的回答。

            如果遇到无法处理的问题,建议用户联系人工客服。

            """;

        

        // 创建对话链

        String response = chatModel.generate(

            systemMessage + "\n\n" +

            "对话历史:\n" + memory.messages().stream()

                .map(chatMessage -> chatMessage.type() + ": " + chatMessage.text())

                .collect(Collectors.joining("\n")) +

            "\n\n用户最新消息: " + userMessage

        );

        

        // 更新对话记忆

        memory.add(UserMessage.from(userMessage));

        memory.add(AiMessage.from(response));

        

        log.info("客服对话 - 用户: {}, 助手: {}", userMessage, response);

        return response;

    }

<"sport.football.zqbty.cn">

<"www.sport.zqbty.cn">

<"wap.sport.zqbty.cn">

}

```


**工具调用与函数执行**

```java

public class WeatherService {

    

    @Tool("获取指定城市的当前天气信息")

    public String getWeather(@P("城市名称") String city) {

        // 模拟天气API调用

        log.info("查询城市天气: {}", city);

        

        Map weatherData = Map.of(

            "北京", "晴,25°C",

            "上海", "多云,23°C", 

            "深圳", "阵雨,28°C"

        );

        

        return weatherData.getOrDefault(city, "暂未找到该城市天气信息");

    }

}


public class ToolBasedAgent {

    

    private final OpenAiChatModel chatModel;

    private final WeatherService weatherService;

    

    public ToolBasedAgent() {

        this.chatModel = OpenAiChatModel.builder()

            .apiKey(System.getenv("OPENAI_API_KEY"))

            .modelName("gpt-3.5-turbo")

            .build();

            

        this.weatherService = new WeatherService();

    }

<"m.sport.zqbty.cn">

<"share.sport.zqbty.cn">

<"ei.sport.zqbty.cn">

    

    public String processWithTools(String userMessage) {

        // 注册工具

        ToolExecutor toolExecutor = ToolExecutors.executorFor(

            weatherService, "getWeather"

        );

        

        // 构建工具调用提示

        String prompt = String.format("""

            用户问题: %s

            可用工具: 获取天气信息

            

            请分析是否需要调用工具,如果需要,请提供调用参数。

            """, userMessage);

            

        String response = chatModel.generate(prompt);

        

        // 解析工具调用请求

        if (response.contains("getWeather")) {

            String city = extractCityFromResponse(response);

            return weatherService.getWeather(city);

        }

        

        return response;

    }

    

    private String extractCityFromResponse(String response) {

        // 简单的城市提取逻辑

        if (response.contains("北京")) return "北京";

        if (response.contains("上海")) return "上海";

        if (response.contains("深圳")) return "深圳";

        return "北京"; // 默认值

    }

}

```


#### Agents-Flex框架探索


**智能体系统构建**

```java

@Agent

public class SalesAgent {

    

    @Inject

    private LLM llm;

    

    @Function(name = "product_recommendation", description = "根据用户需求推荐产品")

    public String recommendProduct(

        @Param(name = "user_need", description = "用户需求描述") String userNeed,

        @Param(name = "budget", description = "用户预算") String budget) {

        

        String prompt = String.format("""

            作为销售顾问,请根据以下信息推荐合适的产品:

            用户需求:%s

            预算范围:%s

            

            请提供3个产品推荐,每个推荐包含产品名称、价格区间和主要特点。

            """, userNeed, budget);

            

        return llm.generate(prompt);

    }

    

    @Function(name = "price_negotiation", description = "处理价格谈判")

    public String handleNegotiation(

        @Param(name = "product", description = "产品名称") String product,

        @Param(name = "customer_offer", description = "客户报价") String customerOffer) {

        

        String prompt = String.format("""

            作为销售代表,你需要处理客户的价格谈判:

            产品:%s

            客户报价:%s

            

            请制定一个合理的还价策略,既要维护公司利益,又要考虑客户关系。

            """, product, customerOffer);

            

        return llm.generate(prompt);

    }

<"movie.sport.zqbty.cn">

<"live.sport.zqbty.cn">

<"www.live.zqbty.cn">

}

```


**工作流编排**

```java

@Workflow(name = "customer_service_workflow")

public class CustomerServiceWorkflow {

    

    @Step(order = 1, name = "需求分析")

    public RequirementAnalysis analyzeRequirement(String userMessage) {

        // 分析用户需求

        return new RequirementAnalysis(userMessage);

    }

    

    @Step(order = 2, name = "解决方案生成")

    public Solution generateSolution(RequirementAnalysis analysis) {

        // 基于分析结果生成解决方案

        return new Solution(analysis);

    }

    

    @Step(order = 3, name = "方案优化")

    public Solution optimizeSolution(Solution solution) {

        // 优化解决方案

        return solution.optimize();

    }

    

    @Step(order = 4, name = "结果返回") 

    public String formatResponse(Solution solution) {

        // 格式化最终响应

        return solution.toResponseString();

    }

}

```


#### 多模型集成策略


**统一模型接口**

```java

public interface UnifiedChatService {

    ChatResponse chat(ChatRequest request);

    EmbeddingResponse embed(EmbeddingRequest request);

}


@Service 

public class MultiModelChatService implements UnifiedChatService {

    

    private final OpenAiChatClient openAIClient;

    private final AzureOpenAiChatClient azureClient;

    private final LocalAiChatClient localClient;

    

    public MultiModelChatService(

            OpenAiChatClient openAIClient,

            AzureOpenAiChatClient azureClient, 

            LocalAiChatClient localClient) {

        this.openAIClient = openAIClient;

        this.azureClient = azureClient;

        this.localClient = localClient;

    }

<"wap.live.zqbty.cn">

<"m.live.zqbty.cn">

<"share.live.zqbty.cn">

    

    @Override

    public ChatResponse chat(ChatRequest request) {

        // 根据配置选择合适的模型

        switch (request.getModelType()) {

            case OPENAI:

                return openAIClient.call(createPrompt(request));

            case AZURE:

                return azureClient.call(createPrompt(request));

            case LOCAL:

                return localClient.call(createPrompt(request));

            default:

                throw new IllegalArgumentException("不支持的模型类型");

        }

    }

    

    private Prompt createPrompt(ChatRequest request) {

        return new Prompt(request.getMessage(), request.getOptions());

    }

}

```


#### 检索增强生成(RAG)实现


**向量存储与检索**

```java

@Service

public class RAGService {

    

    private final EmbeddingClient embeddingClient;

    private final VectorStore vectorStore;

    private final ChatLanguageModel chatModel;

    

    public RAGService(EmbeddingClient embeddingClient, 

                     VectorStore vectorStore,

                     ChatLanguageModel chatModel) {

        this.embeddingClient = embeddingClient;

        this.vectorStore = vectorStore;

        this.chatModel = chatModel;

    }

    

    public String searchAndGenerate(String query) {

        // 生成查询向量

        Embedding queryEmbedding = embeddingClient.embed(query);

        

        // 向量相似度搜索

        List relevantDocs = vectorStore.similaritySearch(

            SearchRequest.defaults()

                .queryEmbedding(queryEmbedding)

                .maxResults(3)

                .minScore(0.7)

        );

        

        // 构建增强提示

        String context = relevantDocs.stream()

            .map(Document::getContent)

            .collect(Collectors.joining("\n\n"));

            

        String enhancedPrompt = String.format("""

            基于以下参考信息回答问题:

            

            %s

            

            问题:%s

            

            请根据参考信息提供准确的回答,如果信息不足请明确说明。

            """, context, query);

        

        return chatModel.generate(enhancedPrompt);

    }

<"ei.live.zqbty.cn">

<"movie.live.zqbty.cn">

<"www.movie.zqbty.cn">

    

    public void addDocument(String document) {

        Embedding embedding = embeddingClient.embed(document);

        vectorStore.add(List.of(new Document(document, embedding)));

    }

}

```


#### 性能优化与监控


**缓存策略实现**

```java

@Service

public class CachedChatService {

    

    private final ChatLanguageModel chatModel;

    private final Cache responseCache;

    

    public CachedChatService(ChatLanguageModel chatModel) {

        this.chatModel = chatModel;

        this.responseCache = Caffeine.newBuilder()

            .maximumSize(1000)

            .expireAfterWrite(1, TimeUnit.HOURS)

            .build();

    }

    

    public String getCachedResponse(String prompt) {

        return responseCache.get(prompt, key -> {

            log.info("缓存未命中,调用模型生成响应");

            return chatModel.generate(prompt);

        });

    }

}


@Configuration

@EnableAspectJAutoProxy

public class MonitoringConfig {

    

    @Bean

    public TimedAspect timedAspect(MeterRegistry registry) {

        return new TimedAspect(registry);

    }

}


@Aspect

@Component

public class LLMMonitoringAspect {

    

    @Around("@annotation(LLMOperation)")

    public Object monitorLLMOperation(ProceedingJoinPoint joinPoint) throws Throwable {

        long startTime = System.currentTimeMillis();

        

        try {

            Object result = joinPoint.proceed();

            long duration = System.currentTimeMillis() - startTime;

            

            // 记录指标

            Metrics.timer("llm.operation.duration")

                .record(duration, TimeUnit.MILLISECONDS);

                

            return result;

        } catch (Exception e) {

            Metrics.counter("llm.operation.errors").increment();

            throw e;

        }

    }

}

```


#### 框架选择建议


**技术选型考量因素**

- 项目规模:大型项目适合Spring AI,轻量级场景考虑Agents-Flex

- 团队熟悉度:熟悉Spring生态的团队可优先选择Spring AI

- 性能要求:高并发场景需要评估框架的性能表现

- 功能需求:复杂代理场景可能需要更专业的框架支持


**最佳实践建议**

```java

@Component

public class LLMBestPractices {

    

    // 提示词模板管理

    private final Map promptTemplates = Map.of(

        "customer_service", """

            你是一个专业的客服助手。

            公司信息:{companyInfo}

            产品信息:{productInfo}

            

            用户问题:{userQuestion}

            """,

        "technical_support", """

            你是一个技术专家,负责解决用户的技术问题。

            技术文档:{techDocs}

            

            用户问题:{userQuestion}

            """

    );

    

    public String getFormattedPrompt(String templateKey, 

                                   Map variables) {

        String template = promptTemplates.get(templateKey);

        if (template == null) {

            throw new IllegalArgumentException("未知的提示词模板");

        }

<"wap.movie.zqbty.cn">

<"m.movie.zqbty.cn">

<"share.movie.zqbty.cn">

        

        for (Map.Entry entry : variables.entrySet()) {

            template = template.replace("{" + entry.getKey() + "}", 

                                      entry.getValue());

        }

        

        return template;

    }

}

```


Java LLM开发框架生态正在快速发展,为开发者提供了丰富的选择。通过理解各框架的特点和适用场景,结合项目需求进行合理选择,可以显著提升大语言模型应用的开发效率和质量。随着技术的不断演进,这些框架将继续完善,为Java开发者构建更强大的智能应用提供支持。


请使用浏览器的分享功能分享到微信等