ToB企服应用市场:ToB评测及商务社交产业平台

标题: Java+SpringBoot调用通义千问的大语言模子的API及前端Vue实现联调 [打印本页]

作者: 悠扬随风    时间: 2024-7-30 21:03
标题: Java+SpringBoot调用通义千问的大语言模子的API及前端Vue实现联调
上图中可以显着瞥见通义千问除了有大语言模子,尚有通义千问VL通义千问Audio。因此注意,本文只是针对于通义千问的大语言模子。至于以上两个是做什么的,可自行查看官网。

阿里云官网提供两种提供的快速入门的方法案例:(改进)


在pom.xml文件种导入DashScope SDK的坐标

  1. <!--        通义千问SDK-->
  2. <!-- https://mvnrepository.com/artifact/com.alibaba/dashscope-sdk-java -->
  3. <dependency>
  4.   <groupId>com.alibaba</groupId>
  5.   <artifactId>dashscope-sdk-java</artifactId>
  6.   <version>2.13.0</version>
  7.   <exclusions>
  8.     <exclusion>
  9.       <groupId>org.slf4j</groupId>
  10.       <artifactId>slf4j-simple</artifactId>
  11.     </exclusion>
  12.   </exclusions>
  13. </dependency>
  14. <dependency>
  15.             <groupId>com.squareup.okhttp3</groupId>
  16.             <artifactId>okhttp</artifactId>
  17.             <version>4.10.0</version>
  18.         </dependency>
复制代码

通过messages调用(推荐)


编写Controller层

  1. package com.he.cms.blog.controller;
  2. import com.alibaba.dashscope.aigc.generation.GenerationResult;
  3. import com.alibaba.dashscope.exception.InputRequiredException;
  4. import com.alibaba.dashscope.exception.NoApiKeyException;
  5. import com.he.cms.blog.service.IBlogAiSGenerateService;
  6. import io.swagger.annotations.Api;
  7. import io.swagger.annotations.ApiOperation;
  8. import lombok.extern.slf4j.Slf4j;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.web.bind.annotation.PathVariable;
  11. import org.springframework.web.bind.annotation.RequestMapping;
  12. import org.springframework.web.bind.annotation.RestController;
  13. /**
  14. * @ClassName BlogAiGenerateController
  15. * @Author Hym
  16. * @Date 2024/4/13 23:01
  17. */
  18. @Slf4j
  19. @RestController
  20. //好好学习,走向巅峰!
  21. @Api(tags = "博客生成")
  22. public class BlogAiGenerateController {
  23.     @Autowired
  24.     private IBlogAiSGenerateService blogAiSGenerateService;
  25.     /**
  26.      * 生成博客
  27.      */
  28.     @RequestMapping("/generateArticle/{content}")
  29.     @ApiOperation(value = "生成博客", notes = "生成博客" + "调用方式:" + "生成博客" + "传入参数:" + "content")
  30.     public GenerationResult generateArticle(@PathVariable String content) throws NoApiKeyException, InputRequiredException {
  31.         GenerationResult generationResult = blogAiSGenerateService.BlogAiSGenerate(content);
  32.         log.info(generationResult.toString());
  33.         return generationResult;
  34.     }
  35. }
复制代码

2.3 Servic层及实现类

接口
  1. package com.he.cms.blog.service;
  2. import com.alibaba.dashscope.aigc.generation.GenerationResult;
  3. import com.alibaba.dashscope.exception.InputRequiredException;
  4. import com.alibaba.dashscope.exception.NoApiKeyException;
  5. public interface IBlogAiSGenerateService {
  6.     /**
  7. * 生成博客
  8. *
  9. * @param title   标题
  10. * @param content 内容
  11. * @return 结果
  12. */
  13.     GenerationResult BlogAiSGenerate(String content) throws NoApiKeyException, InputRequiredException;
  14. }
复制代码
实现类
  1. package com.he.cms.blog.service.impl;
  2. import com.alibaba.dashscope.aigc.generation.GenerationResult;
  3. import com.alibaba.dashscope.exception.InputRequiredException;
  4. import com.alibaba.dashscope.exception.NoApiKeyException;
  5. import com.he.cms.blog.service.ICmsBlogAiSGenerateService;
  6. import com.he.cms.utils.CmsBlogQianWenGenerateUtils;
  7. import org.springframework.stereotype.Service;
  8. import javax.annotation.Resource;
  9. /**
  10. * @ClassName BlogAiSGenerateServiceImpl
  11. * @Author Hym
  12. * @Date 2024/4/13 23:06
  13. */
  14. @Service
  15. //好好学习,走向巅峰!
  16. public class CmsBlogAiSGenerateServiceImpl implements ICmsBlogAiSGenerateService {
  17.    @Resource
  18.     private CmsBlogQianWenGenerateUtils cmsBlogQianWenGenerateUtils;
  19.     @Override
  20.     public GenerationResult BlogAiSGenerate(String content)  throws NoApiKeyException, InputRequiredException {
  21.             return  cmsBlogQianWenGenerateUtils.callWithMessage(content);
  22.     }
  23. //    public static void main(String[] args) {
  24. //        CmsBlogAiSGenerateServiceImpl blogAiSGenerateService = new CmsBlogAiSGenerateServiceImpl();
  25. //        try {
  26. //            System.out.println(blogAiSGenerateService.BlogAiSGenerate("给我写一篇java的文章").toString());
  27. //        } catch (NoApiKeyException e) {
  28. //            e.printStackTrace();
  29. //        } catch (InputRequiredException e) {
  30. //            e.printStackTrace();
  31. //        }
  32. //    }
  33. }
复制代码

调用通义千问API的组件


  1. package com.he.cms.utils;
  2. import com.alibaba.dashscope.aigc.generation.Generation;
  3. import com.alibaba.dashscope.aigc.generation.GenerationResult;
  4. import com.alibaba.dashscope.aigc.generation.models.QwenParam;
  5. import com.alibaba.dashscope.common.Message;
  6. import com.alibaba.dashscope.common.MessageManager;
  7. import com.alibaba.dashscope.common.Role;
  8. import com.alibaba.dashscope.exception.ApiException;
  9. import com.alibaba.dashscope.exception.InputRequiredException;
  10. import com.alibaba.dashscope.exception.NoApiKeyException;
  11. import com.alibaba.dashscope.utils.Constants;
  12. import io.swagger.annotations.ApiOperation;
  13. import lombok.extern.slf4j.Slf4j;
  14. import org.springframework.beans.factory.annotation.Value;
  15. import org.springframework.stereotype.Component;
  16. /**
  17. * @ClassName BlogQianWenGenerateUtils
  18. * @Author Hym
  19. * @Date 2024/4/13 23:13
  20. */
  21. //好好学习,走向巅峰!
  22.     @Slf4j
  23.     @Component
  24. public class CmsBlogQianWenGenerateUtils {
  25.         @Value("${tong_yi_cloud.ai_api_Key}")
  26.         private  String qianWenKeyApiKey;
  27.    @ApiOperation("千问生成文章" + "调用方式:" + "千问生成文章" + "传入参数:" + "content")
  28.     public GenerationResult callWithMessage(String content) throws NoApiKeyException, ApiException, InputRequiredException
  29.     {
  30.         Constants.apiKey=qianWenKeyApiKey;
  31.         Generation gen = new Generation();
  32.         MessageManager msgManager = new MessageManager(10);
  33.         Message systemMsg =
  34.                 Message.builder().role(Role.SYSTEM.getValue()).content("你是一个写文章的大师").build();
  35.         Message userMsg = Message.builder().role(Role.USER.getValue()).content(content).build();
  36.         msgManager.add(systemMsg);
  37.         msgManager.add(userMsg);
  38.         QwenParam param =
  39.                 QwenParam.builder().model(Generation.Models.QWEN_TURBO).messages(msgManager.get())
  40.                         .resultFormat(QwenParam.ResultFormat.MESSAGE)
  41.                         .topP(0.8)
  42.                         .enableSearch(true)
  43.                         .build();
  44.         GenerationResult result = gen.call(param);
  45.         log.info("千问api回答的话语为:{}",result);
  46.         return result;
  47.     }
  48. }
复制代码

返回结果

  1. {
  2.   "requestId": "358d15cd-c01c-9052-aa8f-c20232a50148",
  3.   "usage": {
  4.     "inputTokens": 25,
  5.     "outputTokens": 400,
  6.     "totalTokens": 425
  7.   },
  8.   "output": {
  9.     "text": null,
  10.     "finishReason": null,
  11.     "choices": [
  12.       {
  13.         "finishReason": "stop",
  14.         "index": null,
  15.         "message": {
  16.           "role": "assistant",
  17.           "content": "标题:职场探索:打造个人品牌,成功求职之道\n\n在人生的道路上,找工作如同开启一段新的旅程,充满期待与挑战。在这个竞争激烈的市场中,找到理想的工作不仅需要实力的展现,更需要策略和技巧的巧妙运用。以下是一些关键步骤和建议,助你在求职之路上走得更稳健。\n\n首先,自我认知是基石。明确你的职业目标和兴趣,了解自己的优势与劣势,这将帮助你定位理想的职位。一份精心撰写的简历和个性化的求职信,能精准地传达你的专业技能和独特价值,让招聘者一眼看出你的潜力。\n\n其次,提升自我。不断学习和积累经验是提升竞争力的关键。无论是专业技能的精进,还是软技能的培养,如团队合作、沟通能力等,都能让你在众多应聘者中脱颖而出。参加行业研讨会、实习项目或者志愿者活动,都是拓宽视野和积累实战经验的好方法。\n\n网络的力量不容忽视。利用社交媒体平台如LinkedIn建立专业形象,定期更新你的职业动态和成就,不仅能吸引潜在雇主的注意,也能扩大你的人脉圈。同时,关注行业内的招聘信息,积极投递并参与线上面试,可以提高你的曝光率。\n\n面试时,充分准备至关重要。研究公司的文化和价值观,理解他们对岗位的期望,用实例说明你是如何满足这些要求的。展示你的热情、诚实和解决问题的能力,让面试官看到你的诚意和决心。\n\n最后,保持耐心和积极态度。找工作并非一蹴而就,可能会经历挫折,但请记住,每一次的拒绝都是向成功的一步。保持开放的心态,持续学习,不断提升自己,总有一天,机会会降临到有准备的你身上。\n\n总的来说,寻找工作是一个全方位的策略性过程,需要你的智慧、努力和时间。相信自己,坚持下去,你一定能在职场上找到属于你的那片天空。祝你好运,职场之路越走越宽广!",
  18.           "toolCalls": null,
  19.           "toolCallId": null
  20.         }
  21.       }
  22.     ]
  23.   }
  24. }
复制代码

通过prompt调用

改良版本
  1. package test;// Copyright (c) Alibaba, Inc. and its affiliates.
  2. import com.alibaba.dashscope.aigc.conversation.Conversation;
  3. import com.alibaba.dashscope.aigc.conversation.ConversationParam;
  4. import com.alibaba.dashscope.aigc.conversation.ConversationResult;
  5. import com.alibaba.dashscope.exception.ApiException;
  6. import com.alibaba.dashscope.exception.InputRequiredException;
  7. import com.alibaba.dashscope.exception.NoApiKeyException;
  8. import com.alibaba.dashscope.utils.JsonUtils;
  9. public class Main {
  10.     public static void quickStart() throws ApiException, NoApiKeyException, InputRequiredException {
  11.         Conversation conversation = new Conversation();
  12.         String prompt = "用萝卜、土豆、茄子做饭,给我个菜谱。";
  13.         ConversationParam param = ConversationParam
  14.         .builder()
  15.         .model(Conversation.Models.QWEN_TURBO)
  16.         .prompt(prompt)
  17.         .apiKey("你的apiKey")
  18.         .build();
  19.         ConversationResult result = conversation.call(param);
  20.         System.out.println(JsonUtils.toJson(result));
  21.     }
  22.     public static void main(String[] args) {
  23.         try {
  24.             quickStart();
  25.         } catch (ApiException | NoApiKeyException | InputRequiredException e) {
  26.             System.out.println(e.getMessage());
  27.         }
  28.         System.exit(0);
  29.     }
  30. }
复制代码

返回结果

  1. {"requestId":"b384e189-4d38-9f2e-9773-8350c1934f1a",
  2.   "usage":{"input_tokens":32,"output_tokens":433,"total_tokens":465},
  3.   "output":{"text":"当然可以,这里有一个简单而美味的三蔬菜炖煮菜品谱,名为"红烧三蔬(萝卜、土豆、茄子)":\n\n**材料:**\n1. 萝卜1根\n2. 土豆2个\n3. 茄子2个\n4. 大葱1根\n5. 生姜2片\n6. 大蒜3瓣\n7. 食用油适量\n8. 料酒1汤匙\n9. 生抽酱油2汤匙\n10. 红糖2茶匙\n11. 清水适量\n12. 盐适量\n13. 胡椒粉适量\n14. 水淀粉(可选,用于勾芡)\n\n**步骤:**\n1. 萝卜、土豆和茄子分别洗净去皮,切成滚刀块。大葱切段,生姜和大蒜切末备用。\n2. 锅中加入适量食用油,放入红糖小火慢慢炒化,炒至红色泡沫状。\n3. 加入切好的姜蒜末,翻炒出香味。\n4. 倒入切好的萝卜块,翻煎均匀,让每一块都裹上糖色。\n5. 加入土豆块,继续翻煎至表面微黄。\n6. 将茄子块加入锅中,翻煎至所有蔬菜都略微软化。\n7. 倒入料酒,翻炒均匀后加入生抽酱油,翻炒均匀使蔬菜充分吸收调料。\n8. 加入足够的清水,水量以刚好没过蔬菜为宜。盖上锅盖,转中小火慢炖约15-20分钟,直到蔬菜熟软。\n9. 期间可根据口味加入适量的盐和胡椒粉调味。\n10. 如果喜欢汤汁浓稠,可在最后加入少量水淀粉,快速搅拌均匀即可。\n\n这道菜色泽诱人,营养丰富,是家常便饭的好选择。你可以根据个人口味调整食材份量和调料。Enjoy your meal!","finish_reason":"stop"}}
复制代码
官方提供的版本
  1. // Copyright (c) Alibaba, Inc. and its affiliates.
  2. import java.util.concurrent.Semaphore;
  3. import com.alibaba.dashscope.aigc.generation.Generation;
  4. import com.alibaba.dashscope.aigc.generation.GenerationResult;
  5. import com.alibaba.dashscope.aigc.generation.models.QwenParam;
  6. import com.alibaba.dashscope.common.ResultCallback;
  7. import com.alibaba.dashscope.exception.ApiException;
  8. import com.alibaba.dashscope.exception.InputRequiredException;
  9. import com.alibaba.dashscope.exception.NoApiKeyException;
  10. import com.alibaba.dashscope.utils.JsonUtils;
  11. public class Main {
  12.   private final static String PROMPT = "就当前的海洋污染的情况,写一份限塑的倡议书提纲,需要有理有据地号召大家克制地使用塑料制品";
  13.   public static void qwenQuickStart()
  14.       throws NoApiKeyException, ApiException, InputRequiredException {
  15.     Generation gen = new Generation();
  16.     QwenParam param = QwenParam.builder().model(Generation.Models.QWEN_TURBO).prompt(PROMPT)
  17.         .topP(0.8).build();
  18.     GenerationResult result = gen.call(param);
  19.     System.out.println(JsonUtils.toJson(result));
  20.   }
  21.   public static void qwenQuickStartCallback()
  22.       throws NoApiKeyException, ApiException, InputRequiredException, InterruptedException {
  23.     Generation gen = new Generation();
  24.     QwenParam param = QwenParam.builder().model(Generation.Models.QWEN_TURBO).prompt(PROMPT)
  25.         .topP(0.8).build();
  26.     Semaphore semaphore = new Semaphore(0);
  27.     gen.call(param, new ResultCallback<GenerationResult>() {
  28.       @Override
  29.       public void onEvent(GenerationResult message) {
  30.         System.out.println(message);
  31.       }
  32.       @Override
  33.       public void onError(Exception ex){
  34.         System.out.println(ex.getMessage());
  35.         semaphore.release();
  36.       }
  37.       @Override
  38.       public void onComplete(){
  39.         System.out.println("onComplete");
  40.         semaphore.release();
  41.       }
  42.       
  43.     });
  44.     semaphore.acquire();
  45.   }
  46.   public static void main(String[] args) {
  47.     try {
  48.       qwenQuickStart();
  49.       qwenQuickStartCallback();
  50.     } catch (ApiException | NoApiKeyException | InputRequiredException | InterruptedException e) {
  51.       System.out.println(String.format("Exception %s", e.getMessage()));
  52.     }
  53.     System.exit(0);
  54.   }
  55. }
复制代码

前端终极实现结果图



后端使用通义千问SDK调用后,控制台的输出


末了附上该文章的语雀地址:博主语雀

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4