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

Langchain4j AIService (2)

人工智能服务 AIService

AIService简介

什么是AIService

AIService使用面向接口和动态代理的方式完成程序的编写,更灵活的实现高级功能。

  • 链Chain(旧版)

链的概念源自 Python 中的 LangChain。其理念是针对每个常见的用例都设置一条链,比如聊天机器人、

检索增强生成(RAG)等。链将多个底层组件组合起来,并协调它们之间的交互。链存在的主要问题是不

灵活,我们不进行深入的研究。

  • 人工智能服务AIService

在LangChain4j中我们使用AIService完成复杂操作。底层组件将由AIService进行组装。

AIService可处理最常见的操作

  • 为大语言模型格式化输入内容

  • 解析大语言模型的输出结果

  • 支持更高级的功能

    聊天记忆 Chat memory

    工具 Tools

    检索增强生成 RAG

接入并创建AIService

接入AIService

  • 引入依赖

    <!--langchain4j高级功能-->
    <dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-spring-boot-starter</artifactId>
    </dependency>
    

创建AIService

手动创建AIService
  • 创建接口

    public interface Assistant {String chat(String userMessage);
    }
    
  • 测试用例

    @SpringBootTest
    public class AIServiceTest {@Autowiredprivate QwenChatModel qwenChatModel;@Testpublic void testChat() {//创建AIServiceAssistant assistant = AiServices.create(Assistant.class, qwenChatModel);//调用service的接口String answer = assistant.chat("Hello");System.out.println(answer);}
    }
    
使用@AiService创建
  • 创建接口

    // 因为我们在配置文件中同时配置了多个大语言模型,所以需要在这里明确指定(EXPLICIT)模型的beanName(qwenChatModel)
    @AiService(wiringMode = EXPLICIT, chatModel = "qwenChatModel")
    public interface Assistant {String chat(String userMessage);
    }
    
  • 测试用例

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

工作原理

AiServices会组装Assistant接口以及其他组件,并使用反射机制创建一个实现Assistant接口的代理对象

这个代理对象会处理输入和输出的所有转换工作。在这个例子中,chat方法的输入是一个字符串,但是大

模型需要一个 UserMessage 对象。所以,代理对象将这个字符串转换为 UserMessage ,并调用聊天语

言模型。chat方法的输出类型也是字符串,但是大模型返回的是 AiMessage 对象,代理对象会将其转换

为字符串。

简单理解就是:代理对象的作用是输入转换和输出转换

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

相关文章:

  • 读取STM32单片机升级写入Flash的.bin文件方法
  • Vert.x学习笔记-什么是Handler
  • 【第4章 图像与视频】4.2 图像的缩放
  • Java面试八股(Java基础,Spring,SpringBoot篇)
  • 4.1.4 基于数据帧做SQL查询
  • 强化学习极简入门笔记
  • 【Unity基础】Unity新手实战教程:用ScriptableObject控制Cube颜色
  • 【Phytium】飞腾FT2000/4 GPIO功能开发实例
  • Android Gnss模块初步整理
  • Transformer模型:多头注意力机制深度解析
  • 在MDK中自动部署LVGL,在stm32f407ZGT6移植LVGL-8.3,运行demo,显示label
  • leetcode刷题 java总结
  • 数据库 | 使用timescaledb和大模型进行数据分析
  • Allegro 输出生产数据详解
  • BigemapPro 数据坐标转度分秒格式教程
  • C++_核心编程_ 左移运算符重载 “<<” 左移运算符
  • 解释k8s种ConfigMap和Secret的作用,如何在Pod中挂载环境变
  • PortSwigger-04-cors
  • 快递物流查询接口如何用C#进行调用?
  • 微机消谐装置:保障PT柜安全的核心设备
  • 第二章支线一:影之殿堂 · 阴影与过渡魔法
  • 下一代数模ai智能体研发意见征集
  • Win11安装Dify
  • 【Linux】(1)—进程概念-③Linux进程概念与PCB
  • 重温经典算法——选择排序
  • 从“刚性扩容”到“弹性供给”:移动充电服务重构配电网边际成本
  • Node.js 中 require 源码解析
  • 从零起步认知微内核操作系统(AGI)
  • JavaScript 循环语句总结
  • Linux浅谈