吉娅寿 发表于 2025-8-17 16:42:56

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

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


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

大模型调用三件套


导入依赖

导入 Lanchain4j 依赖

导入 BOM 包管理版本

参考文档: 快速开始
<properties>
      
    <langchain4j.version>1.0.1</langchain4j.version>
</properties>

<dependencyManagement>
        <dependencies>
               
      <dependency>
            <groupId>dev.langchain4j</groupId>
            langchain4j-bom</artifactId>
            <version>${langchain4j.version}</version>
            <type>pom</type>
            <scope>import</scope>
                </dependency>
        <dependencies>
</dependencyManagement>导入原生依赖包


[*]导入 Low-Level API 和 High-Level API 的依赖包

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

<dependency>
    <groupId>dev.langchain4j</groupId>
    langchain4j</artifactId>
</dependency>导入SpringBoot 集成依赖包

参考文档: SprintBoot 集成

[*]导入和 SpringBoot 的整合包
<dependency>
    <groupId>dev.langchain4j</groupId>
    langchain4j-open-ai-spring-boot-starter</artifactId>
    <version>1.0.0-beta3</version>
</dependency>
<dependency>
    <groupId>dev.langchain4j</groupId>
    langchain4j-spring-boot-starter</artifactId>
    <version>1.0.0-beta3</version>
</dependency>第三方集成 (通义千问为例)

参考文档:通义千问
导入 BOM 包管理版本

<properties>
      
    <langchain4j-community.version>1.0.1-beta6</langchain4j-community.version>
</properties>

<dependencyManagement>
        <dependencies>
                  
               <dependency>
                       <groupId>dev.langchain4j</groupId>
                       langchain4j-community-bom</artifactId>
                       <version>${langchain4j-community.version}</version>
                       <type>pom</type>
                       <scope>import</scope>
               </dependency>
        </dependencies>
</dependencyManagement>导入 SpringBoot 集成依赖包

<dependency>
        <groupId>dev.langchain4j</groupId>
        langchain4j-community-dashscope-spring-boot-starter</artifactId>
</dependency>创建 ChatModel

APIKey 要从环境变量中获取。 设置方法:百炼平台文档
@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
// 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
// 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 模型。
模型参数

// 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 模型
// 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 接口
[*]打印请求结果
// 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;
    }
}
来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除
页: [1]
查看完整版本: Langchain4j-0-基本概念与依赖导入