当前位置: 首页 > news >正文

【AI】AIService(基本使用与指令定制)

【AI】AIService(基本使用与指令定制)

文章目录

  • 【AI】AIService(基本使用与指令定制)
    • 1. 简介
    • 2. @AIService
      • 2.1 引入依赖
      • 2.2 编写AIService接口
      • 2.3 测试代码
    • 3. 指令定制
      • 3.1 系统提示词
      • 3.2 用户提示词

1. 简介

AIService可以被视为应用程序服务层的一个组件,提供对应的ai服务,所以被称为AIService,它能够帮助我们完成一些复杂的ai操作:

  • 为模型格式化输入内容
  • 解析模型的输出结果
  • 聊天记忆Chat Memory
  • 工具 Tools
  • 检索增强生成RAG

同时AIService有两种使用方式,一种需要手动装配,另一种通过 @AIService 注解即可调用,后面的文章我们都使用 @AIService 来进行讲解。

2. @AIService

@AIService可以添加在服务类上,然后实现组件在AI服务中的自动装配,支持以下常用组件:

  • ChatModel:指定聊天模型
  • StreamingChatModel:流式响应聊天模型
  • ChatMemory:聊天记忆(内存存储)
  • ChatMemoryProvider:分离记忆聊天(可指定存储位置)
  • Tools:可自定义接口服务然后进行调用

以上不同的组件会在后续的文章中讲解,接下来完成对AIService的初步使用:

2.1 引入依赖

<dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-spring-boot-starter</artifactId>
</dependency>

2.2 编写AIService接口

import dev.langchain4j.service.spring.AiService;
import static dev.langchain4j.service.spring.AiServiceWiringMode.EXPLICIT;@AiService(wiringMode = EXPLICIT, chatModel = "qwenChatModel")
public interface Assistant {String chat(String userMessage);
}

其中AIService带了两个参数,wiringMode默认为AiServiceWiringMode.EXPLICIT,即自动装配chatModel,框架会自己去自动装配IOC容器中已有的chatModel,而chatModel参数代表这里我们指定了模型qwenChatModel

2.3 测试代码

可以注解将Assistant注入进测试代码进行调用:

@Autowired
private Assistant assistant;@Test
public void testAssistant() {String answer = assistant.chat("你是谁");System.out.println(answer);
}

执行结果:

我是Qwen,这是我的英文名,中文名叫通义千问。我是阿里云自主研发的超大规模语言模型,能够回答问题、创作文字,还能表达观点、撰写代码。如果您有任何问题或需要帮助,请随时告诉我,我会尽力提供支持。

这样AIService就引入成功了!

3. 指令定制

在将我们的提示词交给ai去解析之前,我们可以通过一些特定的注解,来完成对指令提示词的重新定制

3.1 系统提示词

@AiService(wiringMode = EXPLICIT, chatModel = "qwenChatModel")
public interface Assistant {@SystemMessage("你是我的好朋友小明,请用粤语回答我的问题。 ")String chat(String userMessage);
}

在chat方法上添加@SystemMessage注解,该注解内部内容将会被转换成SystemMessage对象,并于UserMessage一起发给LLM(大语言模型),且会在用户提示词之前提交给模型,相当于给此时的模型回复加上一个角色设定要求定制*,此时再问ai你是谁,回复会有所改变:

在这里插入图片描述

如果你需要定制的要求内容较多,也可以将其存储在一个资源文件中让@SystemMessage去读取:

@AiService(wiringMode = EXPLICIT, chatModel = "qwenChatModel")
public interface Assistant {@SystemMessage(fromResource = "myPrompt.txt")String chat(String userMessage);
}@Test
public void testAssistant()String answer = assistant.chat("你知道故宫吗?");System.out.println(answer);
}

文件内容如下:

在这里插入图片描述

执行结果:
在这里插入图片描述

@SystemMessage的内容只会在这次记忆中给模型发送一次,但效果会在这次记忆中一直延伸。

3.2 用户提示词

@UserMessage能够将方法参数嵌入到预定义的提示结构中,例如:

@UserMessage("你是谁,猜猜{{it}}") 
String chat(String userMessage);@Test
public void testAssistant()String answer = assistant.chat("我是谁");System.out.println(answer);
}

这里的{{it}}表示这里唯一参数的占位符,使用@UserMessage会将我们的提供给ai的提示词信息嵌入到对应的占位符中,如上述的“我是谁”将转变为:

你是谁,猜猜我是谁

执行结果如下:

在这里插入图片描述

如果用户提供的参数不止一个,则需要使用@V来结合使用:

@UserMessage("我的名字是{{name}},今年{{age}}岁,请用天津话回答问题。{{it}}")
String chat(@V("age") String age, @V("name") String name, @V("it") String userMessage);@Test
public void testAssistant() {String answer = assistant.chat("18", "李明", "我是谁");System.out.println(answer);
}// 用户的提问内容会被转变为:我的名字是李明,今年18岁,请用天津话回答问题。我是谁

执行结果:

在这里插入图片描述

同时@V也可作用于@SystemMessage

@SystemMessage(fromResource = "myPrompt.txt")
String chat(@V("age") String age, @V("name") String name, @UserMessage String userMessage);@Test
public void testAssistant() {String answer = assistant.chat("20", "天天", "你那里有什么特色美食吗");System.out.println(answer);
}

文件内容:

在这里插入图片描述

执行结果:

在这里插入图片描述

:这里需要做好对@SystemMessage和@UserMessage的区分,最直接的区别就是:@SystemMessage的内容会单独优先发一条信息给模型,而@UserMessage则是将用户提供的prompt与@UserMessage的内容结合起来然后一起发给模型,所以二者还是有区别的!

以上便是对AIService(基本使用与指令定制)的介绍与使用了,如果上述内容对大家有帮助的话请给一个三连关注吧💕( •̀ ω •́ )✧✨

http://www.xdnf.cn/news/1229059.html

相关文章:

  • 操作系统:远程过程调用( Remote Procedure Call,RPC)
  • 公网服务器上Nginx或者Openresty如何屏蔽IP直接扫描
  • java中的synchronized关键字​
  • 福彩双色球第2025088期篮球号码分析
  • PyTorch 张量核心操作——比较、排序与数据校验
  • 利用DeepSeek将Rust程序的缓冲输出改写为C语言实现提高输出效率
  • 深入 Go 底层原理(十五):cgo 的工作机制与性能开销
  • 探索:Uniapp 安卓热更新
  • 【Android】RecyclerView实现新闻列表布局(1)适配器使用相关问题
  • 原生JS使用svg-pan-zoom库平移和缩放svg
  • 八股取士--docker
  • 【C++】第二十一节—一文详解 | 红黑树实现(规则+效率+结构+插入+查找+验证)
  • Day18--二叉树--530. 二叉搜索树的最小绝对差,501. 二叉搜索树中的众数,236. 二叉树的最近公共祖先
  • 【MQ】kafka同步和异步的区别
  • 函数指针——回调函数
  • MybatisPlus-逻辑删除
  • Redis核心机制与实践深度解析:从持久化到分布式锁
  • 江协科技STM32 13-1 PWR电源控制
  • AG32mcu通过寄存器方式操作cpld
  • 3 使用 Jenkins 构建镜像:将你的应用打包成镜像
  • sqli-labs:Less-18关卡详细解析
  • 【隧道篇 / IPsec】(7.6) ❀ 02. 如何删除向导创建的IPsec安全隧道 (点对点) ❀ FortiGate 防火墙
  • K8S部署ELK(三):部署Elasticsearch搜索引擎
  • Java基础——实现图书管理系统交互功能
  • java实现运行SQL脚本完成数据迁移
  • String boot 接入 azure云TTS
  • 【深度学习②】| DNN篇
  • Python 字典为什么查询高效
  • Python编程基础与实践:Python基础数据类型入门
  • 如何在Ubuntu上部署excalidraw