当前位置: 首页 > 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.lryc.cn/news/608212.html

相关文章:

  • 【MODIS数据】MYD021KM
  • 解决 InputStream 只能读取一次问题
  • 位运算-371.两整数之和-力扣(LeetCode)
  • 9.3panic!最佳实践
  • 高效截图的4款工具深度解析
  • 从基础功能到自主决策, Agent 开发进阶路怎么走?
  • 自动化革命:软件开发的引擎与未来蓝图
  • 二、无摩擦刚体捉取——固定捉取
  • 第14届蓝桥杯Python青少组中/高级组选拔赛(STEMA)2022年12月18日真题
  • C++刷题 - 7.27
  • Rust: 工具链版本更新
  • Kubernetes Service 全面详解:从概念到实践
  • 具身智能VLA困于“数据泥潭”,人类活动视频数据是否是“破局之钥”?
  • 北京-4年功能测试2年空窗-报培训班学测开-今天来聊聊我的痛苦
  • 对于考研数学的理解
  • Linux 系统管理-15-OpenSSH 服务管理
  • 【Pytorch✨】LSTM 入门
  • Next.js 怎么使用 Chakra UI
  • 洛谷做题4:P5713 【深基3.例5】洛谷团队系统
  • OAuth 2.0 详解:现代授权的核心协议
  • 知识随记-----Qt 实战教程:使用 QNetworkAccessManager 发送 HTTP POST
  • Web前端实现银河粒子流动特效的3种技术方案对比与实践
  • C#中的除法
  • 【Web】CCF智能汽车大赛-CTF遴选赛 wp
  • LVGL代码框架简介
  • 苹果MAC 安卓模拟器
  • 计算机网络:任播和负载均衡的区别
  • 【QT】Qt信号与槽机制详解信号和槽的本质自定义信号和槽带参数的信号和槽
  • 【Python修仙编程】(二) Python3灵源初探(11)
  • linux中pthread_t 的值与top -Hp中线程id值的区别