Langchain4j-0-基本概念与依赖导入

模型开发和常规开发层级对比

  • Prompt:好比UI层,进行用户交互
  • Langchain4j, Spring AI:好比Controller,调用AI大模型
  • 各类AI大模型:好比Service,提供人工智能服务
  • 向量数据库:好比Mapper,进行数据存储

大模型调用三件套

导入依赖

导入 Lanchain4j 依赖

导入 BOM 包管理版本

参考文档: 快速开始

xml 复制代码
<properties>  
    <!-- langchain4j -->  
    <langchain4j.version>1.0.1</langchain4j.version>  
</properties>

<dependencyManagement>  
	<dependencies>
        <!--langchain4j的依赖清单,加载BOM后所有langchain4j版本号可以被统一管理起来  
        https://docs.langchain4j.dev/get-started        -->        
        <dependency>  
            <groupId>dev.langchain4j</groupId>  
            <artifactId>langchain4j-bom</artifactId>  
            <version>${langchain4j.version}</version>  
            <type>pom</type>  
            <scope>import</scope>  
		</dependency>
	<dependencies>
</dependencyManagement>

导入原生依赖包

  • 导入 Low-Level API 和 High-Level API 的依赖包
xml 复制代码
<!--langchain4j-open-ai 基础-->  
<dependency>  
    <groupId>dev.langchain4j</groupId>  
    <artifactId>langchain4j-open-ai</artifactId>  
</dependency>  
<!--langchain4j 高阶-->  
<dependency>  
    <groupId>dev.langchain4j</groupId>  
    <artifactId>langchain4j</artifactId>  
</dependency>

导入SpringBoot 集成依赖包

参考文档: SprintBoot 集成

  • 导入和 SpringBoot 的整合包
xml 复制代码
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
    <version>1.0.0-beta3</version>
</dependency>
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-spring-boot-starter</artifactId>
    <version>1.0.0-beta3</version>
</dependency>

第三方集成 (通义千问为例)

参考文档:通义千问

导入 BOM 包管理版本

xml 复制代码
<properties>  
    <!--langchain4j-community 引入阿里云百炼平台依赖管理清单-->  
    <langchain4j-community.version>1.0.1-beta6</langchain4j-community.version>  
</properties>

<dependencyManagement>  
	<dependencies>
		<!--引入阿里云百炼平台依赖管理清单  
		https://docs.langchain4j.dev/integrations/language-models/dashscope  
		-->  
		 <dependency>  
			 <groupId>dev.langchain4j</groupId>  
			 <artifactId>langchain4j-community-bom</artifactId>  
			 <version>${langchain4j-community.version}</version>  
			 <type>pom</type>  
			 <scope>import</scope>  
		 </dependency>
	</dependencies>  
</dependencyManagement>

导入 SpringBoot 集成依赖包

xml 复制代码
<dependency>  
	<groupId>dev.langchain4j</groupId>  
	<artifactId>langchain4j-community-dashscope-spring-boot-starter</artifactId>  
</dependency>

创建 ChatModel

APIKey 要从环境变量中获取。 设置方法:百炼平台文档

java 复制代码
@Bean  
public ChatModel chatModelQwen()  
{  
    System.out.println("ALIQWEN_API: "+System.getenv("ALIQWEN_API"));  
    return OpenAiChatModel.builder()  
                    .apiKey(System.getenv("ALIQWEN_API"))  
                    .modelName("qwen-plus")  
                    .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")  
            .build();  
}

创建 AI Service

原生整合:手动创建 AI Service

java 复制代码
// ChatAssistant.java
public interface ChatAssistant  
{  
    String chat(String prompt);  
}

// Config.java
@Bean  
public ChatAssistant chatAssistant(@Qualifier("qwen") ChatModel chatModelQwen)  
{  
    return AiServices.create(ChatAssistant.class, chatModelQwen);  
}

// Controller.java
@RestController  
@Slf4j  
public class HighApiController  
{  
    @Resource  
    private ChatAssistant chatAssistant;  
  
    @GetMapping(value = "/highapi/highapi")  
    public String highApi(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt)  
    {  
        return chatAssistant.chat(prompt);  
    }  
}
  • 和 SpringBoot 整合:声明式创建 AI Service
java 复制代码
// ChatAssiatant.java
@AiService  
public interface ChatAssistant  
{  
    String chat(String prompt);  
}

// Controller.java
@RestController  
public class DeclarativeAIServiceController  
{  
    @Resource  
    private ChatAssistant chatAssistant;    
  
    @GetMapping(value = "/lc4j/boot/chatAssistant")  
    public String deepseekAI(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt)  
    {  
        return chatAssistant.chat(prompt);   
    }  
  
}

@AIService(wiringMode = EXPLICIT, chatModel = "chatModelQwen") 可以指定改 AI Service 使用的是 chatModelQwen 模型。

模型参数

java 复制代码
// Config.java
@Configuration  
public class LLMConfig  
{  
    @Bean(name = "qwen")  
    public ChatModel chatModelQwen()  
    {  
        return OpenAiChatModel.builder()  
                    .apiKey(System.getenv("ALIQWEN_API"))  
                    .modelName("qwen-plus")  
                    .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")  
                .logRequests(true) // 日志级别设置为debug才有效  
                .logResponses(true)// 日志级别设置为debug才有效  
                .listeners(List.of(new TestChatModelListener()))  // 事件监听
                .maxRetries(2) // 最大重试次数
                .timeout(Duration.ofSeconds(5)) // 请求大模型的超时时间
                .build();  
    }  
}
// Linstener.java
@Slf4j  
public class TestChatModelListener implements ChatModelListener  
{  
    @Override  
    public void onRequest(ChatModelRequestContext requestContext)  
    {  
  
        // onRequest配置的k:v键值对,在onResponse阶段可以获得,上下文传递参数好用  
        String uuidValue = IdUtil.simpleUUID();  
        requestContext.attributes().put("TraceID",uuidValue);  
        log.info("请求参数requestContext:{}", requestContext+"\t"+uuidValue);  
    }  
  
    @Override  
    public void onResponse(ChatModelResponseContext responseContext)  
    {  
        Object object = responseContext.attributes().get("TraceID");  
  
        log.info("返回结果responseContext:{}", object);  
    }  
  
    @Override  
    public void onError(ChatModelErrorContext errorContext)  
    {  
        log.error("请求异常ChatModelErrorContext:{}", errorContext);  
    }  
}

图片生产模型

使用 qwen-vl-max 模型

java 复制代码
// Config.java
@Configuration  
public class LLMConfig  
{  
    @Bean  
    public ChatModel ImageModel() {  
        return OpenAiChatModel.builder()  
                .apiKey(System.getenv("ALIQWEN_API"))  
                //qwen-vl-max 是一个多模态大模型,支持图片和文本的结合输入,适用于视觉-语言任务。  
                .modelName("qwen-vl-max")  
                .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")  
                .build();  
    }
}

发送用户消息:

  • 图片转 Base 64 编码
  • 构造请求消息 UserMessage :包含文字和转码后的图片
  • 调用 .chat 接口
  • 打印请求结果
java 复制代码
// ImageModeController.java
@RestController  
@Slf4j  
public class ImageModelController  
{  
    @Autowired  
    private ChatModel chatModel;  
  
    @Value("classpath:static/images/mi.jpg")  
    private Resource resource;//import org.springframework.core.io.Resource;  
  
    /**  
    * @Description: 通过Base64编码将图片转化为字符串  
     *              结合ImageContent和TextContent形成UserMessage一起发送到模型进行处理。  
    * @Auther: zzyybs@126.com  
     *     *测试地址:http://localhost:9006/image/call  
    */    @GetMapping(value = "/image/call")  
    public String readImageContent() throws IOException  
    {  
        String result = null;  
  
        //第一步,图片转码:通过Base64编码将图片转化为字符串  
        byte[] byteArray = resource.getContentAsByteArray();  
        String base64Data = Base64.getEncoder().encodeToString(byteArray);  
  
        //第二步,提示词指定:结合ImageContent和TextContent一起发送到模型进行处理。  
        UserMessage userMessage = UserMessage.from(  
                TextContent.from("从下面图片种获取来源网站名称,股价走势和5月30号股价"),  
                ImageContent.from(base64Data, "image/jpg")  
        );  
        //第三步,API调用:使用OpenAiChatModel来构建请求,并通过chat()方法调用模型。  
        //请求内容包括文本提示和图片,模型会根据输入返回分析结果。  
        ChatResponse chatResponse = chatModel.chat(userMessage);  
  
        //第四步,解析与输出:从ChatResponse中获取AI大模型的回复,打印出处理后的结果。  
        result = chatResponse.aiMessage().text();  
  
        //后台打印  
        System.out.println(result);  
  
        //返回前台  
        return result;  
    }  
}