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

基于 LangChain4j 实现问答机器人

img

2022 年 11 月 30 日,OpenAI 发布了基于 GPT-3.5 模型调优的新一代对话式AI模型 ChatGPT。随后的一段时间,国内外各大厂商都纷纷跟进,以至于在 2023 年间出现了“百模大战”这一历史节点。

如今的大语言模型(Large Language Model,简称_LLM_),无论是在底层的基座,还是下游的应用都取得了很大的成功。其中,在2022年同期发布的 LangChain 框架作为LLM应用层开发框架,备受追捧。不过,最开始的时候,并没有 Java 语言的实现。

“一个访问HTTPS的接口的轮子罢了,有什么困难?”

是的,所以23年末,就出现了 LangChain4J 这款产品。Spring 家族也在 24 年中旬发布了Spring AI的 M1 (Milestone 1)版本。

让主 Java 语言的开发者喊出那句话:“Make Java Great Again!”。

目录

\1. 关于这只“鹦鹉”

\2. 快速演示

\3. 机器人实战

关于这只“鹦鹉”

在官方的GitHub下面,有人提问(issues/8673):

LangChain 的 logo 有什么含义?

只有一个非官方的回答:

AI 大型语言模型经常被比作或称为“随机鹦鹉”,这是一种花哨的说法,即它们可以生成模仿人类输出的文本,但它们对生成的内容没有任何真正的“理解”。这个库的作用是将这些 “鹦鹉” 链接在一起,以获得更有意义和有用的输出。

其实这也隐喻着 LLM 的一个本质:模仿🦜与思维链🔗

LangChain4j并没有像原框架那么完善的体系,不过对于简化 Java 在 LLMs 的开发已经非常足够。

img功能介绍

快速上手

如果只想快速体验一下 AI 应用开发,只需要一个简易的 Maven 即可。

配置

只需要官方的 OpenAI 包即可使用。这里的 LLM 的选择并不强制绑定国外,国内对于 API 的兼容性还是比较好的。

<dependency>
     <groupId>dev.langchain4j</groupId>
     <artifactId>langchain4j-open-ai</artifactId>
 </dependency>

key的选择

对于 API Key,官方提供了一个演示的“后门”,只需要把 Key 的值设置为 Demo 即可。当然,这是一个限量的,并且依赖比较自由的网络。

对于大多数而言,选择一个国内的大模型更为便捷。以下使用腾讯的hunyuan-lite作为演示。

img大模型控制台

将 key 放环境变量(可选),放在代码中也是可以的

img
环境变量的设置

编码

由于太过简化,直接上代码演示:

#main 中的逻辑,省去了非核心代码。

// 从系统变量中取得key
String apiKey = System.getenv("hunyuan_key");
// 配置基础模型,此处使用了builder设计模式,链式调用。
OpenAiChatModel model = OpenAiChatModel.builder()
  .apiKey(apiKey)
  .modelName("hunyuan-lite")
  .baseUrl("https://api.hunyuan.cloud.tencent.com/v1")
  .build();
// 发送请求,并将答案赋给answer
String answer = model.generate("如何高效学习");
// 引入log是为了方便后续调试。使用System.out.println输出也是没有问题的!
log.info(answer);

hunyuan-lite是免费模型,在功能和速度上有一点限制。再加上是直接输出,可能需要等待一点时间:

稍后可在控制台看到类似的以下输出:

img基础输出

流式回答

在与 ChatGPT 进行对话时,可以观察到它是一个字一个字的“敲”出来。避开 LLM 的原理不谈,Java 该如何实现呢?

框架已经想好了这一部分,详细说明查看 dev.langchain4j.model.StreamingResponseHandler

public interface StreamingResponseHandler<T> {
  // 拿到响应时的处理
  void onNext(String token);
  // 响应结束时的处理
  default void onComplete(Response<T> response) {}
  // 出现异常的处理
  void onError(Throwable error);
}

对于这样的接口实现,可以选择实现类-> 匿名实现类->lambda表达式->方法引用。

最后得到如下代码:

String apiKey = System.getenv("hunyuan_key");
OpenAiStreamingChatModel openAiStreamingChatModel = OpenAiStreamingChatModel.builder()
  .apiKey(apiKey)
  .modelName("hunyuan-lite")
  .baseUrl("https://api.hunyuan.cloud.tencent.com/v1")
  .build();

openAiStreamingChatModel.generate("如何高效学习", onNext(System.out::print));

效果演示

img流式输出

机器人实战

接下来进入机器人搭建的实战

初始化

虽说不强制绑定Spring,但就目前环境来说,开发一个应用还是离不开他。为了能够让前端能更好的呈现效果,还需要引入Flux相关依赖:


  <dependency>
      <groupId>dev.langchain4j</groupId>
      <artifactId>langchain4j-reactor</artifactId>
      <version>0.35.0</version>
  </dependency>
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-webflux</artifactId>
  </dependency>

AI 服务

在boot项目中,如果想全局任意位置调用一个服务,需要使用@Bean注解。AI 也可以如此。

@Configuration
public class HunyuanStreamModelConfig {

    @Bean
    OpenAiStreamingChatModel getHunyuanAI() {
        String apiKey = System.getenv("hunyuan_key");
        OpenAiStreamingChatModel openAiStreamingChatModel = OpenAiStreamingChatModel.builder()
                .apiKey(apiKey)
                .modelName("hunyuan-lite")
                .baseUrl("https://api.hunyuan.cloud.tencent.com/v1")
                .build();
        return openAiStreamingChatModel;
    }
}
...
// 使用
@Resource
private OpenAiStreamingChatModel model;

而现实情况是,有时需要记忆功能,有时需要嵌入功能。一个固定了的模型对象有点捉襟见肘,以上这种不是很推荐。

对于LangChain4j 来说,他们提供的AI Service 是一个简单模板接口。通过注解加入出参,完成了提示词模板,格式化输出等操作。

public interface Assistant {

 @UserMessage("下面的描述正确吗?{{message}}")
 boolean isRight(String message);

流式输出以及接收

本篇主题不为前端,但简单介绍一下如何对流式问题做出响应。

前端处理

const response = await fetch('/ai-answer?question=如何进行高效的学习');
if (!response.ok) {
  throw new Error('网络请求错误');
}
const reader = response.body.getReader();
const decoder = new TextDecoder('utf-8');
let result = '';
while (true) {
  const { done, value } = await reader.read();
  if (done) break;
  result += decoder.decode(value, { stream: true });
  // 动态更新页面内容
  document.getElementById('answer').innerHTML += decoder.decode(value, { stream: true }).replaceAll("data:","");
}

后端的接口为“/ai-answer”,所以在第一行使用fetch发出请求。8-9 行为正式处理流。

后端Controller

@GetMapping(value = "/ai-answer", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> streamAnswers(String question) {
    return getStreamingAnswer(question);
}

Flux<String> getStreamingAnswer(String question) {
    String apiKey = System.getenv("hunyuan_key");
    OpenAiStreamingChatModel openAiStreamingChatModel = OpenAiStreamingChatModel.builder()
            .apiKey(apiKey)
            .modelName("hunyuan-lite")
            .baseUrl("https://api.hunyuan.cloud.tencent.com/v1")
            .build();
    Assistant assistant = AiServices.create(Assistant.class, openAiStreamingChatModel);

    return assistant.chat(question);
}

演示效果

img
展示

如何学习AI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。


http://www.kler.cn/a/402829.html

相关文章:

  • tcpdump抓包 wireShark
  • 使用itextpdf进行pdf模版填充中文文本时部分字不显示问题
  • 跨境出海安全:如何防止PayPal账户被风控?
  • React中 setState 是同步的还是异步的?调和阶段 setState 干了什么?
  • 软件测试——性能测试概念篇
  • 网络协议之邮件协议(SMTP、POP3与IMAP)
  • 内容补充页(相关公式解释)
  • C++11————线程库
  • Android Jetpack WorkManager 基础
  • Ubuntu VNC Session启动chromium和firefox报错
  • 03 —— Webpack 自动生成 html 文件
  • Spring Boot项目集成Redisson 原始依赖与 Spring Boot Starter 的流程
  • Vue 3 中 toRaw 的详细讲解
  • 前端:JavaScript (学习笔记)【1】
  • 学习与理解LabVIEW中的格式化写入(Format into String)函数
  • ioDraw Mac客户端安装教程
  • 目录背景缺少vscode右键打开选项
  • 基于xr-frame实现微信小程序的手部、手势识别3D模型叠加和石头剪刀布游戏功能
  • 【蓝桥杯备赛】123(前缀和的复杂应用)
  • 【企业级分布式系统】 Kafka集群
  • 局域网协同办公软件,2024安全的协同办公软件推荐
  • OAI-5G开源通信平台实践(四)
  • 手机怎么玩腐蚀?GameViewer远程串流玩腐蚀教程
  • Facebook投放nutra广告最新指南
  • A股分钟tick以及level2行情数据获取方法已经策略分享
  • Linux下多线程