解锁AI的神秘力量: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>

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

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);
    }
}

运行代码结果为:

Hello there! How can I assist you today?

这样,我们使用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();

多轮对话

我们通过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("请重复"));
    }

运行代码结果为:

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

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

    }

运行代码结果为:

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

一样的情况,因为第二次调用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());

    }

运行代码结果为:

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

打字机流式响应

当我们通过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);
            }
        });

    }

结语

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

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

  • 24
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以!下面是一个简单的示例,展示了如何使用库函数编写一个指纹验证和密码验证的智能门锁程序。 ```python class SmartLock: def __init__(self): self.fingerprint_database = {} # 存储指纹和对应的用户信息 self.password_database = {} # 存储密码和对应的用户信息 def add_fingerprint(self, fingerprint, user_info): self.fingerprint_database[fingerprint] = user_info def add_password(self, password, user_info): self.password_database[password] = user_info def unlock(self): input_type = input("请输入验证方式(1为指纹,2为密码):") if input_type == "1": fingerprint = input("请放置指纹:") if fingerprint in self.fingerprint_database: user_info = self.fingerprint_database[fingerprint] print("验证成功!欢迎回来,{}".format(user_info)) else: print("验证失败!指纹不匹配!") elif input_type == "2": password = input("请输入密码:") if password in self.password_database: user_info = self.password_database[password] print("验证成功!欢迎回来,{}".format(user_info)) else: print("验证失败!密码错误!") else: print("输入无效!") # 示例用法 lock = SmartLock() lock.add_fingerprint("指纹1", "用户1") lock.add_password("123456", "用户2") lock.unlock() ``` 在这个示例中,`SmartLock` 类代表智能门锁。它有两个数据库,一个用于存储指纹和对应的用户信息,另一个用于存储密码和对应的用户信息。`add_fingerprint` 和 `add_password` 方法用于向数据库中添加指纹和密码。 `unlock` 方法用于尝试解锁门锁。用户需要选择验证方式:1 表示指纹验证,2 表示密码验证。根据用户选择的验证方式,程序会要求用户输入相应的指纹或密码。然后,程序会在对应的数据库中查找匹配的指纹或密码。如果找到匹配项,则表示验证成功,否则表示验证失败。 请注意,这只是一个简单的示例,实际的智能门锁系统可能需要更复杂的逻辑和安全性措施。希望这个示例能为您提供一些启发!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值