(01)使用LangChain4j prompt和javaPojo进行格式化输出,Aiservice的使用

本章节进入实用内容环节:

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助手! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鶸的日常ORz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值