diff --git a/adaptive-rag/pom.xml b/adaptive-rag/pom.xml index e3695a6a..e33bbd01 100644 --- a/adaptive-rag/pom.xml +++ b/adaptive-rag/pom.xml @@ -4,7 +4,7 @@ org.bsc.langgraph4j langgraph4j-parent - 1.0-beta5 + 1.0-20240924 langgraph4j-adaptive-rag diff --git a/adaptive-rag/src/main/java/dev/langchain4j/adaptiverag/AnswerGrader.java b/adaptive-rag/src/main/java/dev/langchain4j/adaptiverag/AnswerGrader.java index b342f1af..fa747292 100644 --- a/adaptive-rag/src/main/java/dev/langchain4j/adaptiverag/AnswerGrader.java +++ b/adaptive-rag/src/main/java/dev/langchain4j/adaptiverag/AnswerGrader.java @@ -24,7 +24,7 @@ public static class Score { public String binaryScore; } - @StructuredPrompt("User question: \\n\\n {question} \\n\\n LLM generation: {generation}") + @StructuredPrompt("User question: \\n\\n {{question}} \\n\\n LLM generation: {{generation}}") @Value(staticConstructor="of") public static class Arguments { String question; diff --git a/agent-executor/pom.xml b/agent-executor/pom.xml index a3d92a0e..fce0d27d 100644 --- a/agent-executor/pom.xml +++ b/agent-executor/pom.xml @@ -4,7 +4,7 @@ org.bsc.langgraph4j langgraph4j-parent - 1.0-beta5 + 1.0-20240924 langgraph4j-agent-executor diff --git a/core-jdk8/pom.xml b/core-jdk8/pom.xml index c8e074a8..6a658d41 100644 --- a/core-jdk8/pom.xml +++ b/core-jdk8/pom.xml @@ -5,7 +5,7 @@ org.bsc.langgraph4j langgraph4j-parent - 1.0-beta5 + 1.0-20240924 langgraph4j-core-jdk8 diff --git a/how-tos/adaptiverag.ipynb b/how-tos/adaptiverag.ipynb new file mode 100644 index 00000000..b4ab814a --- /dev/null +++ b/how-tos/adaptiverag.ipynb @@ -0,0 +1,277 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "String userHomeDir = System.getProperty(\"user.home\");\n", + "String localRespoUrl = \"file://\" + userHomeDir + \"/.m2/repository/\";\n", + "String langchain4jVersion = \"0.34.0\"" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[0mRepository \u001b[1m\u001b[32mlocal\u001b[0m url: \u001b[1m\u001b[32mfile:///Users/bsorrentino/.m2/repository/\u001b[0m added.\n", + "\u001b[0mRepositories count: 5\n", + "\u001b[0mname: \u001b[1m\u001b[32mcentral \u001b[0murl: \u001b[1m\u001b[32mhttps://repo.maven.apache.org/maven2/ \u001b[0mrelease:\u001b[32mtrue \u001b[0mupdate:\u001b[32mnever \u001b[0msnapshot:\u001b[32mfalse \u001b[0mupdate:\u001b[32mnever \n", + "\u001b[0m\u001b[0mname: \u001b[1m\u001b[32mjcenter \u001b[0murl: \u001b[1m\u001b[32mhttps://jcenter.bintray.com/ \u001b[0mrelease:\u001b[32mtrue \u001b[0mupdate:\u001b[32mnever \u001b[0msnapshot:\u001b[32mfalse \u001b[0mupdate:\u001b[32mnever \n", + "\u001b[0m\u001b[0mname: \u001b[1m\u001b[32mjboss \u001b[0murl: \u001b[1m\u001b[32mhttps://repository.jboss.org/nexus/content/repositories/releases/ \u001b[0mrelease:\u001b[32mtrue \u001b[0mupdate:\u001b[32mnever \u001b[0msnapshot:\u001b[32mfalse \u001b[0mupdate:\u001b[32mnever \n", + "\u001b[0m\u001b[0mname: \u001b[1m\u001b[32matlassian \u001b[0murl: \u001b[1m\u001b[32mhttps://packages.atlassian.com/maven/public \u001b[0mrelease:\u001b[32mtrue \u001b[0mupdate:\u001b[32mnever \u001b[0msnapshot:\u001b[32mfalse \u001b[0mupdate:\u001b[32mnever \n", + "\u001b[0m\u001b[0mname: \u001b[1m\u001b[32mlocal \u001b[0murl: \u001b[1m\u001b[32mfile:///Users/bsorrentino/.m2/repository/ \u001b[0mrelease:\u001b[32mtrue \u001b[0mupdate:\u001b[32mnever \u001b[0msnapshot:\u001b[32mtrue \u001b[0mupdate:\u001b[32malways \n", + "\u001b[0m" + ] + } + ], + "source": [ + "%dependency /add-repo local \\{localRespoUrl} release|never snapshot|always\n", + "%dependency /list-repos" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Adding dependency \u001b[0m\u001b[1m\u001b[32morg.slf4j:slf4j-jdk14:2.0.9\n", + "\u001b[0mAdding dependency \u001b[0m\u001b[1m\u001b[32morg.bsc.langgraph4j:langgraph4j-core-jdk8:1.0-SNAPSHOT\n", + "\u001b[0mAdding dependency \u001b[0m\u001b[1m\u001b[32mdev.langchain4j:langchain4j:0.34.0\n", + "\u001b[0mAdding dependency \u001b[0m\u001b[1m\u001b[32mdev.langchain4j:langchain4j-open-ai:0.34.0\n", + "\u001b[0mSolving dependencies\n", + "Resolved artifacts count: 26\n", + "Add to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/slf4j/slf4j-jdk14/2.0.9/slf4j-jdk14-2.0.9.jar\u001b[0m\n", + "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/slf4j/slf4j-api/2.0.9/slf4j-api-2.0.9.jar\u001b[0m\n", + "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/bsc/langgraph4j/langgraph4j-core-jdk8/1.0-SNAPSHOT/langgraph4j-core-jdk8-1.0-SNAPSHOT.jar\u001b[0m\n", + "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/bsc/async/async-generator-jdk8/2.0.1/async-generator-jdk8-2.0.1.jar\u001b[0m\n", + "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/dev/langchain4j/langchain4j/0.34.0/langchain4j-0.34.0.jar\u001b[0m\n", + "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/dev/langchain4j/langchain4j-core/0.34.0/langchain4j-core-0.34.0.jar\u001b[0m\n", + "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar\u001b[0m\n", + "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/apache/opennlp/opennlp-tools/1.9.4/opennlp-tools-1.9.4.jar\u001b[0m\n", + "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/jsoup/jsoup/1.16.1/jsoup-1.16.1.jar\u001b[0m\n", + "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/dev/langchain4j/langchain4j-open-ai/0.34.0/langchain4j-open-ai-0.34.0.jar\u001b[0m\n", + "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/dev/ai4j/openai4j/0.20.0/openai4j-0.20.0.jar\u001b[0m\n", + "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/com/squareup/retrofit2/retrofit/2.9.0/retrofit-2.9.0.jar\u001b[0m\n", + "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/com/squareup/retrofit2/converter-jackson/2.9.0/converter-jackson-2.9.0.jar\u001b[0m\n", + "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/com/fasterxml/jackson/core/jackson-databind/2.17.2/jackson-databind-2.17.2.jar\u001b[0m\n", + "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/com/fasterxml/jackson/core/jackson-annotations/2.17.2/jackson-annotations-2.17.2.jar\u001b[0m\n", + "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/com/fasterxml/jackson/core/jackson-core/2.17.2/jackson-core-2.17.2.jar\u001b[0m\n", + "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/com/squareup/okhttp3/okhttp/4.12.0/okhttp-4.12.0.jar\u001b[0m\n", + "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/com/squareup/okio/okio/3.6.0/okio-3.6.0.jar\u001b[0m\n", + "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/com/squareup/okio/okio-jvm/3.6.0/okio-jvm-3.6.0.jar\u001b[0m\n", + "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/com/squareup/okhttp3/okhttp-sse/4.12.0/okhttp-sse-4.12.0.jar\u001b[0m\n", + "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.9.10/kotlin-stdlib-jdk8-1.9.10.jar\u001b[0m\n", + "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/jetbrains/kotlin/kotlin-stdlib/1.9.10/kotlin-stdlib-1.9.10.jar\u001b[0m\n", + "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/jetbrains/kotlin/kotlin-stdlib-common/1.9.10/kotlin-stdlib-common-1.9.10.jar\u001b[0m\n", + "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/jetbrains/annotations/13.0/annotations-13.0.jar\u001b[0m\n", + "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.9.10/kotlin-stdlib-jdk7-1.9.10.jar\u001b[0m\n", + "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/com/knuddels/jtokkit/1.1.0/jtokkit-1.1.0.jar\u001b[0m\n", + "\u001b[0m" + ] + } + ], + "source": [ + "%dependency /add org.slf4j:slf4j-jdk14:2.0.9\n", + "%dependency /add org.bsc.langgraph4j:langgraph4j-core-jdk8:1.0-SNAPSHOT\n", + "%dependency /add dev.langchain4j:langchain4j:\\{langchain4jVersion}\n", + "%dependency /add dev.langchain4j:langchain4j-open-ai:\\{langchain4jVersion}\n", + "\n", + "%dependency /resolve" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Initialize Logger" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-09-24 17:14:57 INFO REPL.$JShell$12 do_it$ LET'S START\n" + ] + } + ], + "source": [ + "var lm = java.util.logging.LogManager.getLogManager();\n", + "lm.checkAccess(); \n", + "try( var file = new java.io.FileInputStream(\"./logging.properties\")) {\n", + " lm.readConfiguration( file );\n", + "}\n", + "\n", + "var log = org.slf4j.LoggerFactory.getLogger(\"AdaptiveRag\");\n", + "log.info( \"LET'S START\" );\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Test Issue [#32](https://github.com/bsorrentino/langgraph4j/issues/32)\n", + "\n", + "Issue concerns a problem on `AdaptiveRag` implementation referred to `AnswerGrader` task" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "import dev.langchain4j.model.chat.ChatLanguageModel;\n", + "import dev.langchain4j.model.input.Prompt;\n", + "import dev.langchain4j.model.input.structured.StructuredPrompt;\n", + "import dev.langchain4j.model.input.structured.StructuredPromptProcessor;\n", + "import dev.langchain4j.model.openai.OpenAiChatModel;\n", + "import dev.langchain4j.model.output.structured.Description;\n", + "import dev.langchain4j.service.AiServices;\n", + "import dev.langchain4j.service.SystemMessage;\n", + "import java.time.Duration;\n", + "import java.util.function.Function;\n", + "\n", + "\n", + "public class AnswerGrader implements Function {\n", + "\n", + " static final String MODELS[] = { \"gpt-3.5-turbo-0125\", \"gpt-4o-mini\" };\n", + "\n", + " /**\n", + " * Binary score to assess answer addresses question.\n", + " */\n", + " public static class Score {\n", + "\n", + " @Description(\"Answer addresses the question, 'yes' or 'no'\")\n", + " public String binaryScore;\n", + "\n", + " @Override\n", + " public String toString() {\n", + " return \"Score: \" + binaryScore;\n", + " }\n", + " }\n", + "\n", + " @StructuredPrompt(\"\"\"\n", + "User question: \n", + "\n", + "{{question}}\n", + "\n", + "LLM generation: \n", + "\n", + "{{generation}}\n", + "\"\"\")\n", + " record Arguments(String question, String generation) {\n", + " }\n", + "\n", + " interface Service {\n", + "\n", + " @SystemMessage(\"\"\"\n", + "You are a grader assessing whether an answer addresses and/or resolves a question. \n", + "\n", + "Give a binary score 'yes' or 'no'. Yes, means that the answer resolves the question otherwise return 'no'\n", + " \"\"\")\n", + " Score invoke(String userMessage);\n", + " }\n", + "\n", + " String openApiKey;\n", + "\n", + " @Override\n", + " public Score apply(Arguments args) {\n", + " ChatLanguageModel chatLanguageModel = OpenAiChatModel.builder()\n", + " .apiKey( System.getenv(\"OPENAI_API_KEY\") )\n", + " .modelName( MODELS[1] )\n", + " .timeout(Duration.ofMinutes(2))\n", + " .logRequests(true)\n", + " .logResponses(true)\n", + " .maxRetries(2)\n", + " .temperature(0.0)\n", + " .maxTokens(2000)\n", + " .build();\n", + "\n", + "\n", + " Service service = AiServices.create(Service.class, chatLanguageModel);\n", + "\n", + " Prompt prompt = StructuredPromptProcessor.toPrompt(args);\n", + "\n", + " log.trace( \"prompt: {}\", prompt.text() );\n", + " \n", + " return service.invoke(prompt.text());\n", + " }\n", + "\n", + "}\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-09-24 17:14:58 FINEST REPL.$JShell$23$AnswerGrader apply prompt: User question:\n", + "\n", + "does it concern the Mathematics ?\n", + "\n", + "LLM generation:\n", + "\n", + "text\n", + "\n" + ] + }, + { + "data": { + "text/plain": [ + "Score: no" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "\n", + "var grader = new AnswerGrader();\n", + "\n", + "var args = new AnswerGrader.Arguments( \"does it concern the Mathematics ?\", \"text\" );\n", + "grader.apply( args )" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Java (rjk 2.1.0)", + "language": "java", + "name": "rapaio-jupyter-kernel" + }, + "language_info": { + "codemirror_mode": "java", + "file_extension": ".jshell", + "mimetype": "text/x-java-source", + "name": "java", + "nbconvert_exporter": "script", + "pygments_lexer": "java", + "version": "22.0.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/how-tos/logging.ipynb b/how-tos/logging.ipynb index c79efe89..ba699467 100644 --- a/how-tos/logging.ipynb +++ b/how-tos/logging.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 8, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -13,9 +13,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "RuntimeException", + "evalue": "Existing maven repository: local", + "output_type": "error", + "traceback": [ + "\u001b[0m\u001b[1m\u001b[31mRuntimeException: Existing maven repository: local\n\u001b[0m", + "\u001b[0m\u001b[1m\u001b[34m at org.rapaio.jupyter.kernel.core.magic.dependencies.MimaDependencyManager.addMavenRepository(MimaDependencyManager.java:60)\u001b[0m", + "\u001b[0m\u001b[1m\u001b[34m at org.rapaio.jupyter.kernel.core.magic.handlers.DependencyHandler.evalLineAddRepo(DependencyHandler.java:160)\u001b[0m", + "\u001b[0m\u001b[1m\u001b[34m at org.rapaio.jupyter.kernel.core.magic.MagicHandler.eval(MagicHandler.java:40)\u001b[0m", + "\u001b[0m\u001b[1m\u001b[34m at org.rapaio.jupyter.kernel.core.magic.MagicEngine.eval(MagicEngine.java:95)\u001b[0m", + "\u001b[0m\u001b[1m\u001b[34m at org.rapaio.jupyter.kernel.core.RapaioKernel.handleExecuteRequest(RapaioKernel.java:191)\u001b[0m", + "\u001b[0m\u001b[1m\u001b[34m at org.rapaio.jupyter.kernel.channels.ShellChannel.lambda$bind$0(ShellChannel.java:52)\u001b[0m", + "\u001b[0m\u001b[1m\u001b[34m at org.rapaio.jupyter.kernel.channels.LoopThread.run(LoopThread.java:21)\u001b[0m" + ] + } + ], "source": [ "%dependency /add-repo local \\{localRespoUrl} release|never snapshot|always\n", "%dependency /list-repos" @@ -42,7 +58,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -63,9 +79,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-09-24 17:07:12 INFO REPL.$JShell$15 do_it$ this is a info message INFO1\n", + "2024-09-24 17:07:12 INFO REPL.$JShell$15 do_it$ this is a info message INFO1\n" + ] + } + ], "source": [ "\n", "var log = org.slf4j.LoggerFactory.getLogger(org.bsc.langgraph4j.CompiledGraph.class);\n", diff --git a/how-tos/logging.properties b/how-tos/logging.properties index 37fb1876..c8f594d5 100644 --- a/how-tos/logging.properties +++ b/how-tos/logging.properties @@ -22,3 +22,4 @@ java.util.logging.SimpleFormatter.format = %1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS % # Set the logging level to FINER for the package a.b.c org.bsc.langgraph4j.level = INFO +AdaptiveRag.level = FINEST \ No newline at end of file diff --git a/image-to-diagram/pom.xml b/image-to-diagram/pom.xml index d51097fa..2cf66690 100644 --- a/image-to-diagram/pom.xml +++ b/image-to-diagram/pom.xml @@ -4,7 +4,7 @@ org.bsc.langgraph4j langgraph4j-parent - 1.0-beta5 + 1.0-20240924 langgraph4j-image-to-diagram diff --git a/pom.xml b/pom.xml index e22d2e3f..2cdca04e 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.bsc.langgraph4j langgraph4j-parent - 1.0-beta5 + 1.0-20240924 pom langgraph4j::parent diff --git a/server-jetty/pom.xml b/server-jetty/pom.xml index a0aed6db..49650ae2 100644 --- a/server-jetty/pom.xml +++ b/server-jetty/pom.xml @@ -6,7 +6,7 @@ org.bsc.langgraph4j langgraph4j-parent - 1.0-beta5 + 1.0-20240924 langgraph4j-server-jetty