当前位置:   article > 正文

解锁AI的神秘力量:LangChain4j带你步入智能化实践之门_dev.langchain4j

dev.langchain4j

关注微信公众号 “程序员小胖” 每日技术干货,第一时间送达!

引言

在数字化转型的浪潮中,人工智能(AI)正逐渐成为推动企业创新和增长的关键力量。然而,将AI技术融入到日常业务流程并非易事,它需要跨越技术门槛,解决兼容性问题,并确保数据安全。今天,我们将带您了解一个革命性的AI集成框架——LangChain4j,它为Java开发者提供了一条通往智能化未来的捷径。

LangChain4j不仅仅是一个工具,它代表了一种全新的工作方式,一种将复杂AI技术变得触手可及的理念。通过这篇文章,我们将探索LangChain4j如何帮助企业解锁智能化潜能,优化业务流程,并在竞争激烈的市场中保持领先。

无论您是技术领域的探索者还是企业的决策者,LangChain4j的故事都不容错过。让我们一起启程,深入了解这个能够编织智慧链条、引领创新潮流的AI框架。

LangChain4j

Java版本的LangChain,随着大模型的不断发展,如何在程序中更好的利用大模型的能力来提高编程效率是一种趋势,LangChain是这么自己介绍自己的:

LangChain gives developers a framework to construct LLM‑powered apps easily.

意思是:LangChain提供了一个开发框架,使得开发者可以很容易的用来构建具有LLM能力的应用程序。

LLM就是Large Language Model,也就是常说的大语言模型,简称大模型。

个人认为:大模型时代,如何将大模型能力和传统应用相结合,使得传统应用更加智能,是人工智能时代的趋势。以前一个应用要获得智能,需要企业自己投入资源训练模型,而现在只需要接入大模型即可,这种便利性将使得大模型会应用得更为广泛,而如何将大模型能力和Java编程语言相结合,这就是LangChain4j所做的。

注意,大模型的能力远远不止聊天的能力,而LangChain4j就在帮助我们更好的利用大模型的能力,从而帮我们打造出更加智能的应用。

使用场景

LangChain4j 的使用场景广泛,覆盖了从基础的聊天机器人、问答系统到复杂的文档检索、知识管理、自动化工作流以及行业特定的AI解决方案等多个领域。以下是几个具体的使用场景:

  1. 客户服务自动化:企业可以利用LangChain4j构建智能客服系统,自动处理客户咨询、投诉和常见问题解答,提高服务效率和客户满意度。

  2. 内部知识管理:员工可以通过LangChain4j驱动的知识库搜索引擎快速获取公司政策、操作手册、技术文档等信息,提高工作效率。

  3. 内容创作与编辑:内容创作者和编辑团队可以利用LangChain4j辅助创作,例如自动生成文章概要、润色文本、甚至是基于现有素材生成新的创意内容。

  4. 个性化推荐系统:电商平台或媒体平台可以结合用户行为数据和LangChain4j的分析能力,提供更加个性化的商品或内容推荐。

  5. 智能分析报告:企业数据分析团队可以利用LangChain4j分析大数据集,自动生成易于理解的分析报告和业务洞察。

优势

  1. 高度模块化设计:允许开发者根据需要选择和组合模块,构建符合特定需求的解决方案,提高了灵活性和可扩展性。

  2. 强大的扩展性:支持对接多种语言模型和外部数据源,随着技术进步和新模型的出现,框架能快速适应和集成。

  3. 高效性能优化:针对Java环境进行了优化,确保模型运行高效,即使在处理大规模数据和高并发请求时也能保持良好性能。

  4. 易用性和可维护性:提供了简洁的API接口和详细的文档,降低了开发门槛,使得非AI背景的开发者也能快速上手。

  5. 丰富的社区支持和生态发展:活跃的开发者社区不断贡献新模块、案例和最佳实践,促进了框架的持续迭代和功能丰富。

  6. 企业级安全与合规:考虑到企业对数据安全和隐私的需求,LangChain4j设计时可能考虑了相应的安全措施和合规要求,确保模型的使用符合企业标准。

LangChain4j 实战

单轮对话

新建一个Maven工程,然后引入langchain4j的核心依赖、langchain4j集成OpenAi各个模型的依赖

       <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j</artifactId>
            <version>0.29.1</version>
        </dependency>
       <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-open-ai</artifactId>
            <version>${langchain4j.version}</version>
        </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

程序的首次运行输出,标志着我们与这门新知识的初次“问候”,也象征着大模型学习之旅的起点

package org.example;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;

/**
 * Despriction
 *
 * @author 程序员小胖
 * @version v1.1
 * @since 2024/5/8 15:07
 */
public class HelloWorld {

    public static void main(String[] args) {
        ChatLanguageModel model = OpenAiChatModel.withApiKey("demo");

        String answer = model.generate("hello world! ");

        System.out.println(answer);
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

运行代码结果为:

Hello there! How can I assist you today?
  • 1

这样,我们使用LangChain4j第一次成功的和OpenAi的GPT模型进行了对话,正常来说,调用OpenAi的API接口需要在OpenAi的官网去申请ApiKey才能调用成功,而我这里传入的ApiKey为"demo"却也能调通,查看源码得知这是因为demo是openai为我们提供的测试的apiKey

在底层在构造OpenAiChatModel时,会判断传入的ApiKey是否等于"demo",如果等于会将OpenAi的原始API地址"https://api.openai.com/v1"改为"http://langchain4j.dev/demo/openai/v1",这个地址是langchain4j专门为我们准备的一个体验地址,实际上这个地址相当于是"https://api.openai.com/v1"的代理,我们请求代理时,代理会去调用真正的OpenAi接口,只不过代理会将自己的ApiKey传过去,从而拿到结果返回给我们。
所以,真正开发时,需要大家设置自己的apiKey或baseUrl,可以这么设置:

ChatLanguageModel model = OpenAiChatModel.builder()
	.baseUrl("http://langchain4j.dev/demo/openai/v1")
	.apiKey("demo")
	.build();
  • 1
  • 2
  • 3
  • 4

多轮对话

我们通过ChatLanguageModel的generate()方法向大模型提出问题:

 public static void main(String[] args) {
        ChatLanguageModel model = OpenAiChatModel.withApiKey("demo");

        String answer = model.generate("你好,你是谁?");
        System.out.println(answer);
        System.out.println(model.generate("请重复"));
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

运行代码结果为:

你好!我是一个人工智能助手,可以回答你的问题和提供帮助。有什么可以帮到你的吗?
请重复
  • 1
  • 2
    public static void main(String[] args) {
        ChatLanguageModel model = OpenAiChatModel.withApiKey("demo");

        String answer = model.generate("你好,我是程序员小胖");
        System.out.println(answer);
        System.out.println(model.generate("我叫什么名字?"));

    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

运行代码结果为:

你好,程序员小胖!有什么问题或者需要帮助的吗?
您叫什么名字?
  • 1
  • 2

一样的情况,因为第二次调用generate()方法是一次单独的会话,那么如何做到使得两次或多次generate()在同一个会话中呢?在LangChain4j中有一个ChatMemory组件,它就是专门用来实现会话功能的,但是它需要结合LangChain4j中的AiService来使用,我们后面再介绍,现在我们先使用笨办法来解决多轮对话的问题。
在ChatLanguageModel中有多个generate()重载方法:


我们前面使用的就是第一个generate()方法,而第二个和第三个generate()方法都是接收一个ChatMessage集合,并且返回一个AiMessage,那么ChatMessage和AiMessage分别都表示什么意思呢?

ChatMessage是一个接口,表示聊天消息,它有以下四种实现:

  1. UserMessage:表示用户发送给大模型的消息
  2. AiMessage:表示大模型响应给用户的消息
  3. SystemMessage:也是用户发送给大模型的消息,和UserMessage不同在于,SystemMessage一般是应用程序帮用户设置的,举个例子,假如有一个作家应用,那么“请你扮演一名作家,请帮我写一篇关于春天的作文”,其中“请你扮演一名画家”就是SystemMessage,“请帮我画一幅关于春天的作品”就是UserMessage
  4. ToolExecutionResultMessage:也是用户发送给大模型的,表示工具的执行结果。
    我们先重点关注UserMessage和AiMessage,它们就相当于请求和响应,所以如果我们想要实现多轮对话,可以这么实现:
    public static void main(String[] args) {
        ChatLanguageModel model = OpenAiChatModel.withApiKey("demo");

        UserMessage userMessage1 = UserMessage.userMessage("你好,我是程序员小胖!");
        Response<AiMessage> response1 = model.generate(userMessage1);
        AiMessage aiMessage1 = response1.content();
        System.out.println(aiMessage1.text());

        Response<AiMessage> response2 = model.generate(userMessage1, aiMessage1, UserMessage.userMessage("我叫什么"));
        AiMessage aiMessage2 = response2.content();
        System.out.println(aiMessage2.text());

    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

运行代码结果为:

你好,小胖!有什么可以帮助你的吗?
你告诉我你叫小胖。
  • 1
  • 2

打字机流式响应

当我们通过ChatLanguageModel的generate()方法向大模型提问时,ChatLanguageModel一次性给了整段响应结果,而不是一个字一个字打字机式的回答,不过我们可以使用OpenAiStreamingChatModel来实现打字机效果.

public static void main(String[] args) {

        StreamingChatLanguageModel model = OpenAiStreamingChatModel.builder()
                .baseUrl("http://langchain4j.dev/demo/openai/v1")
                .apiKey("demo")
                .build();

        model.generate("你好,你是谁?", new StreamingResponseHandler<AiMessage>() {
            @Override
            public void onNext(String token) {

                System.out.println(token);

                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }

            @Override
            public void onError(Throwable error) {
                System.out.println(error);
            }
        });

    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

结语

在探索LangChain4j的旅程中,我们不仅揭开了AI实践的神秘面纱,还发现了如何将这些强大的技术应用到实际业务中。随着智能化时代的大门缓缓开启,让我们携手LangChain4j,共同迈向一个更智能、更高效的未来。

参考地址:
https://www.langchain.com.cn/
https://docs.langchain4j.dev/
https://github.com/langchain4j?tab=repositories

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/632832
推荐阅读
相关标签
  

闽ICP备14008679号