本章节进入实用内容环节:
1、利用prompt结构体进行格式化输出。
先回顾一下上一章节代码:
/**
* prompt 结构体
*
* */
public class L02_StructuredPrompt {
@StructuredPrompt({ //结构体注解,往往用于格式化回复
"""
请查询演员{{name}} 的信息,
回答格式如下:
{
姓名:...,
作品:...,
简介:...,
性别:...
}
"""
})
static class CreatActorPrompt{
//这个类后期可以根据不同的需求去写,多场景化满足
String name;
public CreatActorPrompt(String name) {
this.name = name;
}
}
public static void main(String[] args) {
ChatLanguageModel model = MyModel.getModel();
//实例化模板对象,
CreatActorPrompt prompt_ = new CreatActorPrompt("赵丽蓉");
//prompt调用
Prompt prompt = StructuredPromptProcessor.toPrompt(prompt_);
//让我们试一试
String answer = model.generate(prompt.text());
System.out.println(answer);
//后续可以使用正则表达式对内容进行切割,获取想要的格式
// {
// "姓名":"赵丽蓉",
// "作品":"《西游记》、《还珠格格》、《武林外传》等",
// "简介":"赵丽蓉,中国著名女演员。1930年生于山东省济南市,是20世纪末至21世纪初中国大陆著名的喜剧表演艺术家。她以出演电视剧和小品著称,在演艺界有着广泛的影响力。赵丽蓉在《西游记》中扮演的“车迟国皇后”、《还珠格格》中的“李天霸”和《武林外传》里的“佟湘玉”的母亲等角色,深受观众喜爱。她以其独特的喜剧风格和精湛的演技赢得了广大粉丝的喜爱与尊敬。2000年1月17日,赵丽蓉因病逝世,享年69岁。"
// }
}
代码中使用prompt结构体向llm进行了提问,返回的结果虽然是按照格式化输出了,但每次都这样岂不是很麻烦,而且结构体替换也相对麻烦。
官方提供了javaPojo的方法进行输出内容的格式化:
package Done;
import dev.langchain4j.service.AiServices;
import dev.langchain4j.service.UserMessage;
public class L02_StructuredOutput {
class Address{
String street;
String city;
String name;
String phone;
@Override
public String toString() {
return "Address{" +
"street='" + street + '\'' +
", city='" + city + '\'' +
", name='" + name + '\'' +
", phone='" + phone + '\'' +
'}';
}
}
interface AddressOutput{
@UserMessage("提取信息:{{it}}")
Address getAddressFromAi(String txt);
}
public static void main(String[] args) {
AddressOutput aoservice = AiServices.create(AddressOutput.class,MyModel.getModel());
String text = """
收件人:王zz,住址:北京市 海淀区 坂井路22号,电话:13800138000
""";
Address address = aoservice.getAddressFromAi(text);
System.out.println(address.toString());
}
}
这里注意:{{it}} 在调用时候指向text。{{it}}笔者猜测应该是官方定义的关键字,换成{{xx}}就无效。
如果淡出的进行格式化输出,可以只书写类成员,构造方法啥都不用。
这里的interface AddressOutput其实是个Aiservice的实现接口,用它去调用模型,这里langchain使用了反射技术,构造了Address对象。
2、Aiservice的使用
首先我们先看官方定义:
* 这是一个“AI 服务”。它是一个具有 AI 功能的 Java 服务。 * 它可以像其他服务一样集成到你的代码中,充当一个 Bean,并可以为测试进行模拟。 * 其目标是将 AI 功能无缝集成到你的(现有)代码库中,减少摩擦。 * 它在概念上类似于 Spring Data JPA 或 Retrofit。 * 你定义一个接口,并可选择使用注释对其进行自定义。 * LangChain4j 然后使用代理和反射为该接口提供实现。 * 这种方法抽象了所有的复杂性和样板代码。 * 因此,你不需要处理模型、消息、内存、RAG 组件、工具、输出解析器等。 * 不过,不用担心。它非常灵活和可配置,所以你可以根据具体用例进行调整。
再来,我们一起看下实例代码:
import Done.MyModel;
import dev.langchain4j.service.AiServices;
public class Zz1 {
interface MyAiservice{
String answer(String word);
}
public static void main(String[] args) {
MyAiservice myAiservice = AiServices.create(MyAiservice.class, MyModel.getModel());
String answer = myAiservice.answer("你好呀,我帅不帅");
System.out.println(answer);
}
}
本质上aiservice用于构建客制化服务的类,使用它,可以灵活的构建应用。
下一篇,我们基于之前的内容,开启rag之旅,实现本地个人ai助手!