2. LangChain4j 之AI Services

news2024/11/26 9:58:33

一: AI Services介绍

        LangChain4j提供了很多基础的组件,每次使用都需要你编写大量的样板代码,LangChain4j就提供了一个高级的组件AI Services,它可以简化与大模型(LLM)和其他组件交互的复杂度。让开发者更专注于业务逻辑,而不是底层的实现细节。

        通过AiServices来封装聊天模型API,实现会话记忆,工具调用,搜索增强,内容审查等功能,并提供简单灵活的用户接口 DefaultAiServices是其默认实现类型,通过动态代理的方式实现用户定义的服务接口


二: AI Services功能

  • 处理LLM的输入
  • 解析LLM的输出
  • Chat memory 聊天信息存储器
  • Tools 工具调用
  • RAG 检索增强生成

三: AI Services工作原理

    我们定义一个接口,并将接口的class和LangChain4j的基础组件一起传给AiServices,而AiServices则通过反射创建一个实现此接口的Jdk代理对象。当我们使用这个代理对象去执行方法时,就会去执行代理逻辑,组装UserMessage和SystemMessage对象,然后去调用大模型的接口,返回结果.


四: AI Services实战

注解介绍:

  • @UserMessage: 用户消息
  • @SystemMessage: 系统消息,当@SystemMessage和AiServices.systemMessageProvider(Function) 都配置时, @SystemMessage 优先。
  • @V: 提示模板变量,其值将被注入到通过@UserMessage,@SystemMessage和AiServices.systemMessageProvider定义的提示模版中.
  • @MemoryId: 带有 @MemoryId 注释的方法参数的值将用于查找属于该用户/会话的内存。带有 @MemoryId 注释的参数可以是任何类型,前提是它已正确实现 equals() 和 hashCode() 方法.
  • @Moderate: 和ModerationModel配合使用,对方法的输入进行审核,看是否涉及敏感,不安全的内容.

综合案例

基于AiService实现智能文章小助手

     当我们需要实现智能文章小助手,根据输入的文章标题,得到一篇文章时, 首先需要加上@SystemMessage注解, 告诉大模型让他做什么事情,此时,我们输入文章标题时,大模型才会返回结果给我们. 如果我们需要检测用户输入的文章标题是否包含敏感词,可以使用@Moderate和ModerationModel来支持这个功能, 这个功能没有在智普Ai有找到,所以用了openAi的ModerationModel.

注意事项:

        方法参数大于两个的时候, 每个入参都需要包括@UserMessage,@SystemMessage,@V和

@MemoryId注解中至少一个注解.不然就会报错.

案例代码

public class AiServiceDemo {
    interface Writer {
        @SystemMessage("请扮演一名作家,根据输入的文章题目写一篇{{count}}字以内的作文")
        @Moderate
        String write(@UserMessage String title, @V("count") Integer count);
    }

    public static void main(String[] args) {
        ZhipuAiChatModel zhipuAiModel = ZhipuAiChatModel.builder()
                .apiKey("智普spikey")
                .build();

        OpenAiModerationModel openAiModel = OpenAiModerationModel.builder()
                .apiKey("demo")
                .build();

        Writer writer = AiServices.builder(Writer.class)
                .chatLanguageModel(zhipuAiModel)
                .moderationModel(openAiModel)
                .build();
        //String result = writer.write("我最爱的人",200);
        String result = writer.write("我要杀了你",200);
        System.out.println(result);
    }
}

五: AI Services结构化输出

AI Services支持以下返回类型:

  • String
  • AiMessage
  • boolean/Boolean
  • byte/Byte/short/Short/int/Integer/BigInteger/long/Long/float/Float/double/Double/BigDecimal
  • Date/LocalDate/LocalTime/LocalDateTime
  • List<String>/Set<String>
  • Any Enum
  • Any custom POJO
  • Result<T>

 Enum 和 boolean 作为返回类型

public class AiServiceDemo2 {
    enum Sentiment {
        POSITIVE, NEUTRAL, NEGATIVE
    }
    interface SentimentAnalyzer {

        @UserMessage("Analyze sentiment of {{it}}")
        Sentiment analyzeSentimentOf(String text);
        @UserMessage("Does {{it}} has a positive sentiment?")
        boolean isPositive(String text);
    }
    public static void main(String[] args) {
        ZhipuAiChatModel zhipuAiModel = ZhipuAiChatModel.builder()
                .apiKey("智普apikey")
                .build();
        SentimentAnalyzer sentimentAnalyzer = AiServices.create(SentimentAnalyzer.class, zhipuAiModel);

        Sentiment sentiment = sentimentAnalyzer.analyzeSentimentOf("这是好的吗!");// POSITIVE
        System.out.println(sentiment);

        boolean positive = sentimentAnalyzer.isPositive("It's awful!");
        System.out.println(positive);
    }
}

自定义POJO作为返回类型

@Data
public class Person {
    String firstName;
    String lastName;
    LocalDate birthDate;
    Address address;
}
@Data
public class Address {
    String street;
    Integer streetNumber;
    String city;
}
public class AiServiceDemo {

    interface PersonExtractor {

        @UserMessage("Extract information about a person from {{it}}")
        Person extractPersonFrom(String text);
    }

    public static void main(String[] args) {
        ZhipuAiChatModel zhipuAiModel = ZhipuAiChatModel.builder()
                .apiKey("智普apikey")
                .build();
        PersonExtractor personExtractor = AiServices.create(PersonExtractor.class, zhipuAiModel);

        String text = """
            In 1968, amidst the fading echoes of Independence Day,
            a child named John arrived under the calm evening sky.
            This newborn, bearing the surname Doe, marked the start of a new journey.
            He was welcomed into the world at 345 Whispering Pines Avenue
            a quaint street nestled in the heart of Springfield
            an abode that echoed with the gentle hum of suburban dreams and aspirations.
            """;
        Person person = personExtractor.extractPersonFrom(text);

        System.out.println(person);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1930015.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JavaScript】聊一聊js中的浅拷贝与深拷贝与手写实现

前言 什么是深拷贝与浅拷贝&#xff1f;深拷贝与浅拷贝是js中处理对象或数据复制操作的两种方式。‌在聊深浅拷贝之前咱得了解一下js中的两种数据类型&#xff1a; 基本数据类型&#xff08;6种&#xff09;String、Number、Object、Boolean、null、undefined、symbol&#xff…

李秘书讲写作:面对交通违规处罚不当或误判时怎么办?

李秘书讲写作&#xff1a;面对交通违规处罚不当或误判时怎么办&#xff1f; #李秘书讲写作#在这节讲三个问题&#xff0c;最后一个问题对你非常有用&#xff01;不信请看&#xff1a; 一、个人交通违规处罚不当或误判一般有哪些情形&#xff1f; 在现代社会&#xff0c;交通违规…

框架设计MVP

重点&#xff1a; 1.presenter里面包含view和model 2.和MVP不同的是View和Model之间不进行交互 3.view包含presenter,view通过presenter反向处理逻辑。 链接&#xff1a; MVP简单实现_安卓mvp presenter-CSDN博客 Model.h #pragma once //Model数据处理器 class Model { …

Java、Python、C语言?5大热门编程语言,我该怎么选?

在开始前分享一些编程的资料需要的同学评论888即可拿走 是我根据网友给的问题精心整理的一提到编程&#xff0c;大家就会想到一堆莫名其妙的缩写&#xff0c;比如C、C、JAVA、VB、VC、FoxPro、Delphi、SQL、PHP、ASP、JSP等等&#xff0c;那么编程语言究竟多少种呢&#xff1f;…

数据库:redis练习题

1、安装redis&#xff0c;启动客户端、验证。 redis-server redis-cli 2、string类型数据的命令操作&#xff1a; &#xff08;1&#xff09; 设置键值&#xff1a; set mykey "haha" &#xff08;2&#xff09; 读取键值&#xff1a; get mykey &#xff08;3&…

算法金 | 来了,pandas 2.0

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 今日 210/10000 Pandas 是一个强大的数据分析库&#xff0c;广泛应用于科学研究、金融分析、商业智能等领域。它提供了高效的数据结构…

Jmeter常用组件及执行顺序

一 常用组件 1.线程组 Thread Group 线程组是一系列线程的集合&#xff0c;每一个线程代表着一个正在使用应用程序的用户。在 jmeter 中&#xff0c;每个线程意味着模拟一个真实用户向服务器发起请求。 在 jmeter 中&#xff0c;线程组组件运行用户设置线程数量、初始化方式等…

明日周刊-第16期

最近很想去看一场蔡健雅的演唱会&#xff0c;以前从来没去过演唱会。原先是想把第一次机会留给周杰伦的演唱会&#xff0c;但是周董的票太难抢了。 文章目录 一周热点资源分享言论歌曲推荐 一周热点 一、经济与市场 北京二手房价环比上涨&#xff1a; 6月份&#xff0c;北京二…

JavaScript原型

前言 **原型的使用&#xff1a;**可以通过原型对象来添加共享的方法&#xff0c;这样所有通过该构造函数创建的对象实例都可以访问和使用这些方法。 举例 ● 例如我们现在想在构造函数中添加一个计算年龄的方法&#xff0c;并且这个方法可以让所有的对象实例都可以访问到 P…

C++基础篇(2)

目录 前言 1.缺省参数 2.函数重载 2.1函数重载的基本规则 ​编辑2.2注意事项 2.3 重载解析&#xff08;Overload Resolution&#xff09;--补充内容 3.引用 3.1引用的概念和定义 3.2引用的特性 3.3引用的使用 3.4const引用 4.指针和引用的关系 结束语 前言 上节小编…

互联网末法时代的一些思考

这篇文章也是临时起意&#xff0c;很长一段时间没写个人思考类的文章&#xff0c;主要原因也是时间完全不够用。随着年龄的增长&#xff0c;看待问题的视角也逐渐发生变化&#xff0c;例如从关注现象到关注动机&#xff0c;从关注结果到关注起因&#xff0c;2021年的时代我曾经…

前端设计模式:教科书般的实践指南

前端设计模式&#xff1a;教科书般的实践指南 引言 亲爱的前端小伙伴们&#xff0c;你们是否曾经在代码的海洋中迷失方向&#xff1f;是否曾经被项目经理的"简单需求"折磨得欲仙欲死&#xff1f;别担心&#xff0c;今天我们就来聊聊那些能让你在前端江湖中纵横捭阖…

Qt程序图标更改以及程序打包

Qt程序图标更改以及程序打包 1 windows1.1 cmake1.1.1 修改.exe程序图标1.1.2 修改显示页面左上角图标 1.2 qmake1.2.1 修改.exe程序图标1.2.2 修改显示页面左上角图标 2 程序打包2.1 MinGW2.2 Visual Studio 3 参考链接 QT6 6.7.2 1 windows 1.1 cmake 1.1.1 修改.exe程序图…

新书速览|深入理解Hive:从基础到高阶:视频教学版

《深入理解Hive&#xff1a;从基础到高阶&#xff1a;视频教学版》 本书内容 《深入理解Hive:从基础到高阶:视频教学版》采用“理论实战”的形式编写&#xff0c;通过大量的实例&#xff0c;结合作者多年一线开发实战经验&#xff0c;全面地介绍Hive的使用方法。《深入理解Hiv…

昂科烧录器支持Hynetek慧能泰半导体的三端口控制器HUSB366

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表&#xff0c;其中Hynetek慧能泰半导体的三端口控制器HUSB366已经被昂科的通用烧录平台AP8000所支持。 HUSB366是一款高性能、高集成度的双USB Type-C和一个USB Type-A三端口控制器&#xff0c;…

如何将电子书发送到kindle

修改guide Amazon之kindle 修改邮箱 参考&#xff1a; blog 多种方式&#xff1a;如何将电子书发送到kindle

不用ps?AI生成免抠素材,让你的工作效率翻倍!

在当今的工作和创作中&#xff0c;免抠素材的重要性日益凸显。无论是制作精美的 PPT &#xff0c;还是设计个性化的电子手账&#xff0c;优质的免抠素材都能起到画龙点睛的作用。然而&#xff0c;寻找合适的免抠素材并非易事&#xff0c;很多时候我们会面临各种困扰。 有不少朋…

PHP webshell 免杀方法

本文介绍php类webshell简单的免杀方法&#xff0c;总结不一定全面&#xff0c;仅供读者参考。 webshell通常可分为一句话木马&#xff0c;小马&#xff0c;大马&#xff0c;内存马。 一句话木马是最简单也是最常见的webshell形式&#xff0c;这种木马体积小&#xff0c;隐蔽较…

大厂必争之地!AI搜索产品万字长文分析

多年以前&#xff0c;百度、谷歌等就在开始做智能搜索&#xff0c;但彼时的智能搜索只是对搜索结果的简单整理归纳&#xff0c;效果并不如人意。当前AI爆火&#xff0c;在AI的加持下&#xff0c;搜索会不会更强大一些呢&#xff1f;其实并不是&#xff0c;至少当前AI搜索的使用…

MyBatis源码中的设计模式2

组合模式的应用 组合模式介绍 组合模式(Composite Pattern) 的定义是&#xff1a;将对象组合成树形结构以表示整体和部分的层次结构。组合模式可以让用户统一对待单个对象和对象的组合。 比如&#xff1a;Windows操作系统中的目录结构&#xff0c;通过tree命令实现树形结构展…