Quarkus集成LangChain4J遇java.lang.IllegalStateException错误求助
Quarkus LangChain4J扩展构建报错:Duplicate key null 解决思路
问题概述
构建Quarkus应用时出现如下错误:
Build step io.quarkiverse.langchain4j.deployment.AiServicesProcessor#handleAiServices threw an exception: java.lang.IllegalStateException: Duplicate key null (attempted merging values 0 and 1)
Rest Resource代码
import jakarta.enterprise.context.RequestScoped; import jakarta.inject.Inject; import jakarta.ws.rs.*; @RequestScoped @Path("/translate") public class TranslatorResource { @Inject TranslatorService translatorService; @POST public String translate(@FormParam("text") String text, @FormParam("destination") String destination) { return translatorService.translate(text, destination); } }
Agent代码
import dev.langchain4j.service.SystemMessage; import dev.langchain4j.service.UserMessage; import io.quarkiverse.langchain4j.RegisterAiService; @RegisterAiService public interface TranslatorService { @SystemMessage( """ You are an assistant translator that receives a text and needs to translate it perfectly from one language to another. But you need to detect first in which language the text is written. If the text is already in the destination language, you should return the original text without any changes. """ ) @UserMessage( """ You will receive the text to translate in {text} and will have to translate it to {destination}. The text will be in the following format: {text}. You should return the translated text in the following format: {translated_text}. """ ) String translate(String text, String destination); }
pom.xml配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.dwitech.medilingua</groupId> <artifactId>medilingua-test</artifactId> <version>1.0.0-SNAPSHOT</version> <properties> <java.version>17</java.version> <maven.compiler.source>${java.version}</maven.compiler.source> <maven.compiler.target>${java.version}</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <quarkus.version>3.12.0</quarkus.version> <compiler-plugin.version>3.8.4</compiler-plugin.version> <quarkus-langchain4j.version>0.15.1</quarkus.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>io.quarkus.platform</groupId> <artifactId>quarkus-bom</artifactId> <version>${quarkus.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-rest</artifactId> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-rest-jsonb</artifactId> </dependency> <dependency> <groupId>io.quarkiverse.langchain4j</groupId> <artifactId>quarkus-langchain4j-openai</artifactId> <version>${quarkus-langchain4j.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <forceJavacCompilerUse>true</forceJavacCompilerUse> </configuration> </plugin> <plugin> <groupId>io.quarkus</groupId> <artifactId>quarkus-maven-plugin</artifactId> <version>${quarkus.version}</version> <executions> <execution> <goals> <goal>build</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
完整错误日志
2024-07-02 07:44:21,732 ERROR [io.qua.dep.dev.IsolatedDevModeMain] (main) Failed to start quarkus: java.lang.RuntimeException: io.quarkus.builder.BuildException: Build failure: Build failed due to errors [error]: Build step io.quarkiverse.langchain4j.deployment.AiServicesProcessor#handleAiServices threw an exception: java.lang.IllegalStateException: Duplicate key null (attempted merging values 0 and 1) at java.base/java.util.stream.Collectors.duplicateKeyException(Collectors.java:135) at java.base/java.util.stream.Collectors.lambda$uniqKeysMapAccumulator$1(Collectors.java:182) at java.base/java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682) at io.quarkiverse.langchain4j.deployment.AiServicesProcessor$TemplateParameterInfo.toNameToArgsPositionMap(AiServicesProcessor.java:1221) at io.quarkiverse.langchain4j.deployment.AiServicesProcessor.gatherSystemMessageInfo(AiServicesProcessor.java:958) at io.quarkiverse.langchain4j.deployment.AiServicesProcessor.gatherMethodMetadata(AiServicesProcessor.java:877) at io.quarkiverse.langchain4j.deployment.AiServicesProcessor.handleAiServices(AiServicesProcessor.java:721) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:849) at io.quarkus.builder.BuildContext.run(BuildContext.java:256) at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18) at org.jboss.threads.EnhancedQueueExecutor$Task.doRunWith(EnhancedQueueExecutor.java:2516) at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2495) at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1521) at java.base/java.lang.Thread.run(Thread.java:833) at org.jboss.threads.JBossThread.run(JBossThread.java:483) at io.quarkus.runner.bootstrap.AugmentActionImpl.runAugment(AugmentActionImpl.java:331) at io.quarkus.runner.bootstrap.AugmentActionImpl.createInitialRuntimeApplication(AugmentActionImpl.java:252) at io.quarkus.runner.bootstrap.AugmentActionImpl.createInitialRuntimeApplication(AugmentActionImpl.java:58) at io.quarkus.deployment.dev.IsolatedDevModeMain.firstStart(IsolatedDevModeMain.java:113) at io.quarkus.deployment.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:435) at io.quarkus.deployment.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:56) at io.quarkus.bootstrap.app.CuratedApplication.runInCl(CuratedApplication.java:138) at io.quarkus.bootstrap.app.CuratedApplication.runInAugmentClassLoader(CuratedApplication.java:93) at io.quarkus.deployment.dev.DevModeMain.start(DevModeMain.java:131) at io.quarkus.deployment.dev.DevModeMain.main(DevModeMain.java:62) Caused by: io.quarkus.builder.BuildException: Build failure: Build failed due to errors [error]: Build step io.quarkiverse.langchain4j.deployment.AiServicesProcessor#handleAiServices threw an exception: java.lang.IllegalStateException: Duplicate key null (attempted merging values 0 and 1) at java.base/java.util.stream.Collectors.duplicateKeyException(Collectors.java:135) at java.base/java.util.stream.Collectors.lambda$uniqKeysMapAccumulator$1(Collectors.java:182) at java.base/java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682) at io.quarkiverse.langchain4j.deployment.AiServicesProcessor$TemplateParameterInfo.toNameToArgsPositionMap(AiServicesProcessor.java:1221) at io.quarkiverse.langchain4j.deployment.AiServicesProcessor.gatherSystemMessageInfo(AiServicesProcessor.java:958) at io.quarkiverse.langchain4j.deployment.AiServicesProcessor.gatherMethodMetadata(AiServicesProcessor.java:877) at io.quarkiverse.langchain4j.deployment.AiServicesProcessor.handleAiServices(AiServicesProcessor.java:721) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:849) at io.quarkus.builder.BuildContext.run(BuildContext.java:256) at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18) at org.jboss.threads.EnhancedQueueExecutor$Task.doRunWith(EnhancedQueueExecutor.java:2516) at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2495) at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1521) at java.base/java.lang.Thread.run(Thread.java:833) at org.jboss.threads.JBossThread.run(JBossThread.java:483) at io.quarkus.builder.Execution.run(Execution.java:123) at io.quarkus.builder.BuildExecutionBuilder.execute(BuildExecutionBuilder.java:79) at io.quarkus.deployment.QuarkusAugmentor.run(QuarkusAugmentor.java:160) at io.quarkus.runner.bootstrap.AugmentActionImpl.runAugment(AugmentActionImpl.java:327) ... 9 more
解决思路
1. 修正pom.xml中的版本配置错误
在properties节点中,quarkus-langchain4j.version的闭合标签错误,导致Maven解析时出现版本混乱。将:
<quarkus-langchain4j.version>0.15.1</quarkus.version>
修改为:
<quarkus-langchain4j.version>0.15.1</quarkus-langchain4j.version>
2. 调整UserMessage中的模板重复占位符
@UserMessage中重复使用了{text}占位符,旧版本Quarkus LangChain4J扩展可能存在解析bug,可简化模板避免重复:
@UserMessage( """ Translate the text: {text} to the target language: {destination}. If the text is already in {destination}, return it unchanged. Return only the translated text. """ )
3. 升级扩展版本匹配Quarkus核心
Quarkus 3.12.0对应的LangChain4J扩展版本为0.16.0,修改quarkus-langchain4j.version确保版本兼容:
<quarkus-langchain4j.version>0.16.0</quarkus-langchain4j.version>
4. 清理缓存重新构建
执行以下命令清理Maven缓存并启动开发模式:
mvn clean install quarkus:dev
内容的提问来源于stack exchange,提问作者Daniel W.
相关产品推荐
相关产品推荐

