This is an automated email from the ASF dual-hosted git repository. aldettinger pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel-website.git
The following commit(s) were added to refs/heads/main by this push: new 31b8b4b6 Add blog post about Camel parameter binding annotations with LangChain4j 31b8b4b6 is described below commit 31b8b4b6dd6997191d3e5b1ed66bc7e14331af3e Author: aldettinger <aldettin...@gmail.com> AuthorDate: Tue Oct 1 16:54:26 2024 +0200 Add blog post about Camel parameter binding annotations with LangChain4j --- .../10/langchain4j-camel-annotations/featured.jpg | Bin 0 -> 370479 bytes .../2024/10/langchain4j-camel-annotations/index.md | 107 +++++++++++++++++++++ 2 files changed, 107 insertions(+) diff --git a/content/blog/2024/10/langchain4j-camel-annotations/featured.jpg b/content/blog/2024/10/langchain4j-camel-annotations/featured.jpg new file mode 100644 index 00000000..bf2f03f3 Binary files /dev/null and b/content/blog/2024/10/langchain4j-camel-annotations/featured.jpg differ diff --git a/content/blog/2024/10/langchain4j-camel-annotations/index.md b/content/blog/2024/10/langchain4j-camel-annotations/index.md new file mode 100644 index 00000000..96312eb3 --- /dev/null +++ b/content/blog/2024/10/langchain4j-camel-annotations/index.md @@ -0,0 +1,107 @@ +--- +title: "Using Camel annotations with LangChain4j high level api available in next Camel Quarkus release" +date: 2024-10-10 +draft: false +authors: [aldettinger] +categories: ["Camel", "AI"] +preview: "Explain how to use the Camel parameter binding annotations on LangChain4j AI service method parameters." +--- + +# Introduction + +In a [previous blog post](/blog/2024/09/data-extraction-example/), we have seen how Camel could be used to transform raw unstructured text into structured Java objects. The shown example actually uses the [LangChain4j high level API](https://docs.langchain4j.dev/tutorials/ai-services) where a Java interface will handle the interactions needed with the underlying Large Language Model. However, at this time, a [Quarkus LangChain4j issue](https://github.com/quarkiverse/quarkus-langchain4j/i [...] +This issue will be fixed in the next Camel Quarkus release, so let's see how it will work. + +# Imagine a situation + +Imagine a situation where an LLM should answer a question about an exchange with the following body: + +``` +The car ALPHA4 in its equipped version is priced 40000$. It means higher safety for no more than 2500 additional bucks. +In Europe, the situation is a bit different. The low equipped version of the TRIUMPH car series are far more secured in comparison. +And one would need to afford 50000€ to buy the high level model which is just barely safer. +``` + +After a close look, there are plenty of information that could be extracted by an LLM like the car model, price, level of equipment and so on. +Thinking a bit more, it would be very handy if we could customize a bit the questions sent to the LLM. +For instance, we could imagine an incoming exchange with a header named `carName` that would take values like `ALPHA4` and `TRIUMPH`. +If we were able to inject this header value in the LLM prompt, we would then be able to ask questions about distinct brand of cars. + +Customizing an LLM request with dynamic values originating from an incoming message is interesting. +However, sometimes the application itself could provide a more static value. +Yet, we should be able to customize LLM requests with that kind of information. For instance, let's imagine a bean as below: + +``` +@Named("myBean") +@ApplicationScoped +public class MyBean { + String getLevel() { + return "HIGH"; + } +} +``` + +It would be very nice to inject that bean level inside the LLM prompt. +So, how could we build such a highly customizable LLM based application ? + +# Camel bean annotations to the rescue + +Starting with the next version of Camel Quarkus, such situations could be solved simply by using Camel annotations on the LangChain4j method parameters. +Let's see how. + +First, a new [Camel Quarkus LangChain4j extension](https://github.com/apache/camel-quarkus/commit/11c7ebb2f623bfd8fba54d8bf5e41005be84ce0b) has been created, so let's add the correct dependency: + +```xml +<dependency> + <groupId>org.apache.camel.quarkus</groupId> + <artifactId>camel-quarkus-langchain4j</artifactId> +</dependency> +``` + +Second, as [Quarkus Langchain4j](https://github.com/quarkiverse/quarkus-langchain4j) comes with a lot of dependencies, it's a best practice to align on a given version using the `quarkus-langchain4j-bom` as below: + +```xml +<dependencyManagement> + <dependencies> + <dependency> + <groupId>io.quarkiverse.langchain4j</groupId> + <artifactId>quarkus-langchain4j-bom</artifactId> + <version>${quarkus-langchain4j.version}</version> + <type>pom</type> + <scope>import</scope> + </dependency> + </dependencies> +</dependencyManagement> +``` + +It's up to every developers to choose the value of `${quarkus-langchain4j.version}`. +However, please keep in mind that to use Camel Quarkus parameter binding annotations with Langchain4j, we need to set `quarkus-langchain4j.version` to be greater than `0.19.0`. + +From there, it's just a matter of using the right annotation on the AI service method parameters like below: + +```java +@UserMessage("Given the text delimited by triple back ticks ```{body}```. What is the price of the car {carName} with equipment level {carLevel} ?") +@Handler +String getCarPrice(@Body String body, @Header("carName") String carName, @Bean(ref = "myBean", method = "getLevel") String carLevel); +``` + +See how each method parameter annotation will mandate Camel to inject values coming from body, header and even from a bean method. +Connecting Camel with LangChain4j seems easier than ever. +Finally, please notice how the method parameters could be used as prompt template variables like `{body}`, `{carName}` and `{carLevel}`. + +Let's make it even more concrete and show the prompt with those template variables replaced as below: + +``` +Given the text delimited by triple back ticks ```The well equipped ALPHA4 costs 100$...```. What is the price of the car ALPHA4 with equipment level HIGH ? +``` + +Now we are able to build more customizable LLM prompts. From there, it is up to every developer to use prompt engineering and other LLM technics to finish the development. + +Of course, there is a bit of magic handled by the `camel-quarkus-langchain4j` extension under the hood. +Precisely, there is a unique rule as of now, the annotations to be used should have a package name starting with `org.apache.camel`. +This is enough to inject values with parameter binding annotations like `@Variable`, `@ExchangeProperty`, `@JSonPath` or even `@XPath`. + +# Conclusion + +That's it for this pre-screening of this new feature that should be available with the next Camel Quarkus release, probably version 3.16.0. +The Camel Quarkus LangChain4j extension is experimental, so let's have a try and [give feedback to the community](/community/support/). \ No newline at end of file