小白学大模型 —— LangChain 编程 几个简单demo java版本

内容分享2周前发布
0 0 0

许多网上都是python的操作,但是java也能够操作大模型,列如LangChina4j。如果你国内无法科学上网的话,可以用智谱提供的大模型服务,直接去注册一个账号,然后新建一个key即可使用。

智谱AI开放平台:https://open.bigmodel.cn/

小白学大模型 —— LangChain 编程 几个简单demo java版本

后续直接用我给的demo跑一跑langChain练练,看看为什么那么简单,demo里面包含4个简单的方法。包括目前典型的大模型应用场景。

1、简单的大模型调用

2、带history的大模型调用

3、RAG

4、调用方法的demo

package com.example.demo.test;


import java.util.ArrayList;
import java.util.List;

import dev.langchain4j.agent.tool.Tool;
import dev.langchain4j.data.embedding.Embedding;
import dev.langchain4j.data.message.AiMessage;

import dev.langchain4j.data.message.SystemMessage;
import dev.langchain4j.data.message.UserMessage;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.memory.ChatMemory;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.embedding.AllMiniLmL6V2EmbeddingModel;
import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.model.zhipu.ZhipuAiChatModel;
import dev.langchain4j.service.AiServices;
import dev.langchain4j.store.embedding.EmbeddingMatch;
import dev.langchain4j.store.embedding.EmbeddingStore;
import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;

public class LangChinaDemo {


    private static final String ZHIPU_API_KEY = "7b8c906235a24a3fa73aa5637fb793ca.t0xHFFBzyFlzufPv"; // 替换为你的token



    public static void main(String[] args) {
        System.out.println("=== LangChain4j Java Demo ===");

        // 1. 基础聊天功能演示
        demonstrateBasicChat();

        // 2. 带记忆的聊天演示
        demonstrateChatWithMemory();

        // 3. 简单的RAG演示
        demonstrateSimpleRAG();

        // 4. 函数调用模拟演示
        demonstrateFunctionCalling();
    }

    /**
     * 演示基础聊天功能
     */
    private static void demonstrateBasicChat() {
        System.out.println("
--- 1. 基础聊天演示 ---");
        ChatLanguageModel model = ZhipuAiChatModel.builder()
                .apiKey(ZHIPU_API_KEY)
                .model("glm-4")
                .maxToken(500)
                .temperature(0.7)
                .build();



        String response = model.generate("请用中文简单介绍一下人工智能");
        System.out.println("AI回复: " + response);
    }

    /**
     * 演示带记忆的聊天
     */
    private static void demonstrateChatWithMemory() {
        System.out.println("
--- 2. 带记忆的聊天演示 ---");

        ChatLanguageModel model = ZhipuAiChatModel.builder()
                .apiKey(ZHIPU_API_KEY)
                .model("glm-4-plus")
                .build();

        // 创建带记忆的聊天
        ChatMemory chatMemory = MessageWindowChatMemory.withMaxMessages(10);

        // 添加系统提示
        chatMemory.add(SystemMessage.from("你是一个有用的AI助手,请用中文回答"));
        chatMemory.add(UserMessage.from("请问我叫什么名字?"));
        String response1 = model.generate(chatMemory.messages()).content().text();
        // 第一轮对话
        chatMemory.add(AiMessage.from(response1));
        System.out.println("第一轮: " + response1);

        chatMemory.add(UserMessage.from("我的名字是凡月"));

        // 第二轮对话(模型应该记得名字)
        chatMemory.add(UserMessage.from("我刚才说我叫什么名字?"));


        String response2 = model.generate(chatMemory.messages()).content().text();
        System.out.println("第二轮: " + response2);
    }

    /**
     * 演示简单的RAG(检索增强生成)
     */
    private static void demonstrateSimpleRAG() {
        System.out.println("
--- 3. 简单RAG演示 ---");

        // 使用本地嵌入模型(无需API key)
        EmbeddingModel embeddingModel = new AllMiniLmL6V2EmbeddingModel();

        // 创建内存向量存储
        EmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore<>();

        // 添加一些知识文档
        List<String> knowledgeBase = new ArrayList<>();
        knowledgeBase.add("Java是一种面向对象的编程语言,由Sun Microsystems公司于1995年发布。");
        knowledgeBase.add("Spring Boot是一个基于Spring框架的快速开发脚手架,可以轻松创建独立的、生产级的Spring应用程序。");
        knowledgeBase.add("LangChain是一个用于开发大语言模型应用的框架,支持多种编程语言包括Java和Python。");
        knowledgeBase.add("向量数据库用于存储和检索高维向量,常用于类似性搜索和推荐系统。");

        // 将知识库转换为向量并存储
        for (String text : knowledgeBase) {
            Embedding embedding = embeddingModel.embed(text).content();
            TextSegment segment = TextSegment.from(text);
            embeddingStore.add(embedding, segment);
        }

        System.out.println("知识库已加载到向量存储中");

        // 用户查询
        String userQuery = "Spring Boot是什么?";
        System.out.println("用户查询: " + userQuery);

        // 将查询转换为向量
        Embedding queryEmbedding = embeddingModel.embed(userQuery).content();

        // 在向量库中搜索最相关的内容
        List<EmbeddingMatch<TextSegment>> relevantMatches = embeddingStore.findRelevant(queryEmbedding, 2);

        // 构建上下文
        StringBuilder context = new StringBuilder();
        context.append("请根据以下上下文回答问题:

");
        for (EmbeddingMatch<TextSegment> match : relevantMatches) {
            context.append("- ").append(match.embedded().text()).append("
");
        }
        context.append("
问题:").append(userQuery);

        System.out.println("content:"+ context.toString());
        // 使用LLM基于上下文生成回答
        ChatLanguageModel model = ZhipuAiChatModel.builder()
                .apiKey(ZHIPU_API_KEY)
                .model("glm-4")
                .build();

        String response = model.generate(context.toString());
        System.out.println("RAG回答: " + response);
    }


    /**
     * 演示函数调用模拟
     */
    private static void demonstrateFunctionCalling() {
        System.out.println("
--- 4. 函数调用模拟演示 ---");

        // 1. 创建工具实例
        ToolsCollection tools = new ToolsCollection();

        // 创建Agent
        Agent assistant = AiServices.builder(Agent.class)
                .chatLanguageModel(ZhipuAiChatModel.builder()
                        .apiKey(ZHIPU_API_KEY)
                        .model("glm-4")
                        .build())
                .tools(tools)
                .build();

        // 3. 测试第一个问题(计算价格)
        String userRequest = "请帮我计算如果买3件商品,每件价格是25.5元,总价是多少?";
        System.out.println("用户提问: " + userRequest);
        String response1 = assistant.chat(userRequest);
        System.out.println("AI回复: " + response1);

        System.out.println("++++++++++++++++++++++++++++++++++++++");

        // 4. 测试第二个问题(查询天气)
        String userRequest2 = "北京的天气是多少?";
        System.out.println("用户提问: " + userRequest2);
        String response2 = assistant.chat(userRequest2);
        System.out.println("AI回复: " + response2);

    }

}

// 定义AI助手接口
interface Agent {
    String chat(String userMessage);
}

//工具集
class ToolsCollection{
    // 模拟工具函数,使用注解将方法注入进去

    @Tool("计算总价的函数方法")
    public double calculatePrice(int quantity, double unitPrice) {
        System.out.println("调用求和计算方法 个数:"+quantity+" 价钱:"+unitPrice);
        return quantity * unitPrice;
    }

    @Tool("查询天气")
    public String checkWeather(String city) {
        System.out.println("调用天气查询: " + city);
        return city + ": 晴天,25°C";
    }
}

上面的pom引用:


        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j</artifactId>
            <version>0.31.0</version>
        </dependency>
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-zhipu-ai</artifactId>
            <version>0.31.0</version>
        </dependency>
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-embeddings-all-minilm-l6-v2</artifactId>
            <version>0.31.0</version>
        </dependency>

直接运行即可。

尤其是第四个demo就是agent的雏形。

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...