Open FroMage opened 5 months ago
If you can attach a sample application that we can use to run and debug things, that would be most helpful
application.properties
mvn quarkus:dev
Thanks
I assume I need some data as well?
Nope
I see what the problem is.
dev.langchain4j.service.ServiceOutputParser
from upstream LangChain4j does not really handle collections all that well.
Let me see if we can do better on our side
I tried with arrays before and got a funky error as well.
Yeah, they don't work great
Seems like in upstream the methods I need are private, so I'll have to open a PR to open them.
At some point we probably want to write our own JsonSchema generater from a Jandex type (should be fairly easy), but I don't want to do it now since I have a talk next week.
Maybe I can bait you into doing that? :P
The upstream code that tries to do this is here.
What we need is something that takes org.jboss.jandex.Type
and returns a String
which is the json schema
I wish I had time to do something like that, but I really can't promise anything soon. I also filed https://github.com/quarkiverse/quarkus-langchain4j/issues/675 which I hope I might be able to work on in the future.
šš¼
It would be helpful if the new parser could be customized using the quarkus.langchain4j.response-schema
property (today this is a boolean, but can become an object with different values).
For example, today the use of the {response_schema}
placeholder is replaced by the default value:
You must respond strictly in the following JSON format: <object_schema>
With the custom parser, we could have control of the prefix, which could be enabled or disabled, with a property like
quarkus.langchain4j.response-schema.prefix={true|false}
This allows the developer to remove the prefix and add something else, for example if they are writing the prompt in a language other than English.
That's a good point.
We just need to do this at some point: I don't envision it to be more than a day's work (likely less) :)
@geoand Do I assume correctly that this is a place to use extension specific json schema generator? I so I will give it a try and try to implement it
Correct!
But I think that @andreadimaio was looking at something similar...
I see, well I will give it a shot just in case as without mapped collections it is misses a lot of potential :D
But I think that @andreadimaio was looking at something similar...
I'm looking for how to force the LLM provider to force the use of the json/json-schema mode but not the deserialization of collections.
@geoand I think part in QuarkusServiceOutputParser is one thing, the other is having tools argument to be lists. I found this in ToolProcessor.java is extension deployment:
if ((type.kind() == Type.Kind.ARRAY)
|| DotNames.LIST.equals(typeName)
|| DotNames.SET.equals(typeName)) { // TODO something else?
return removeNulls(ARRAY, description); // TODO provide type of array?
}
Do you happen to have any ideas if its even possible to resolve generic types from Collections there? I think java is eliding generic types at runtime isnt it?
@geoand I think I was wrong about that type elision, I will try to also put required and optional parameters but in general now it works, but I also need to check when strict set, as this is adding some extra field checks on schema. Then I will also adjust output parser
Correct!
https://github.com/quarkiverse/quarkus-langchain4j/pull/1039 seems to cover that pretty well
@geoand Can we reopen this? I wanted to still tackle the case mentioned by @FroMage as well, As mapping results from case he mentions Is handled via QuarkusServiceOutputParser.java, I will take care of this soon. by having extension local parser instead of using langchain4j as you suggested.
Oh, I was not aware it was closed automatically
The docs at https://docs.quarkiverse.io/quarkus-langchain4j/dev/ai-services.html#_ai_method_return_type say I should be able to get a structured return type from my service, but it does not seem to support anything but a
String
.This generates the following exception:
So it looks like the generated service interface has
String
as a method return type.Also, @geoand told me:
But the docs say:
So that's contradictory.