当前位置: 首页 > 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.dtcms.com/a/311495.html

相关文章:

  • cv快速input
  • 【云计算】云主机的亲和性策略(三):云主机 宿主机
  • Springboot原理和Maven高级
  • 操作系统:远程过程调用( Remote Procedure Call,RPC)
  • MQTT 入门教程:三步从 Docker 部署到 Java 客户端实现
  • Linux基础学习笔记二
  • MySQL PostgreSQL JDBC URL 配置允许批量操作
  • C语言输入安全10大边界漏洞解析与防御
  • 基于LSTM模型与加权链路预测的动态热门商品成长性分析
  • SpringBoot相关注解
  • 项目管理平台是什么?概念、定义、作用、主流厂商解读
  • docker:将python开发的大模型应用,打成docker容器
  • C#中的除法
  • PostGIS面试题及详细答案120道之 (081-090 )
  • cuda编程笔记(12)--学习cuFFT的简单使用
  • 【Mybatis】MyBatis分页的三种实现方式,Log4j的使用
  • Elasticsearch 混合检索一句 `retriever.rrf`,把语义召回与关键词召回融合到极致
  • 模拟激光相机工作站版本6.0 5.2.32 6.0.44 6.031 5.2.20
  • 题解:P4447 [AHOI2018初中组] 分组
  • 归并排序(简单讲解)
  • [论文阅读] 人工智能 + 软件工程 | GitHub Marketplace中CI Actions的功能冗余与演化规律研究
  • 【RK3568 看门狗驱动开发详解】
  • Kubernetes Gateway API 详解:现代流量路由管理方案
  • 【最后203篇系列】030 强化学习探索
  • 浏览器及java读取ros1的topic
  • 重生之我在暑假学习微服务第八天《OpenFeign篇》
  • 暑期算法训练.13
  • cv弹窗,退款确认弹窗
  • 数据结构(12)二叉树
  • 深入 Go 底层原理(六):垃圾回收(GC)