当前位置:   article > 正文

LangChain-java 学习篇(一)_langchain java

langchain java

1. 这是什么?

       这是langchain的Java语言实现。大型语言模型(LLM)正成为一种变革性的技术,使开发人员能够构建以前无法构建的应用程序。但是,单个的使用LLM往往不足以创建真正强大的应用程序,当我们能够将它们与其他计算或知识来源相结合时,才会展现出真正的威力。这个库旨在协助开发这类应用程序。

2. 快速入门指南

2.1 Maven存储库

先决条件:

             1.Java 17或更高版本

             2.类Unix环境(我们使用Linux,Mac OS X)

             3.Maven(我们推荐版本3.8.6,至少需要3.5.4)
         

  1. <dependency>
  2. <groupId>io.github.hamawhitegg</groupId>
  3. <artifactId>langchain-core</artifactId>
  4. <version>0.1.12</version>
  5. </dependency> 

2.2扩展 lang-chain框架支持

使用 LangChain 通常需要与一个或多个模型提供程序、数据存储、API 等集成。在本例中,我们将扩展lang-chain框架支持文心一言的API

2.2.1继承BaseLLM
  1. @SuperBuilder
  2. public class WenXinQianFan extends BaseLLM {
  3. private static final Logger LOG = LoggerFactory.getLogger(WenXinQianFan.class);
  4. /**
  5. * Endpoint URL to use.
  6. */
  7. @Builder.Default
  8. private String endpointUrl = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions?access_token=";
  9. /**
  10. * Max token allowed to pass to the model.
  11. */
  12. @Builder.Default
  13. private int maxToken = 4096;
  14. /**
  15. * LLM model temperature from 0 to 10.
  16. */
  17. @Builder.Default
  18. private float temperature = 0.95f;
  19. /**
  20. * History of the conversation
  21. */
  22. @Builder.Default
  23. private List<JSONObject> messages = new ArrayList<>();
  24. /**
  25. * Top P for nucleus sampling from 0 to 1
  26. */
  27. @Builder.Default
  28. private float topP = 1.0f;
  29. @Builder.Default
  30. private float penaltyScore=1.5f;
  31. @Builder.Default
  32. private boolean stream = false;
  33. @Builder.Default
  34. private String accessToken="";
  35. /**
  36. * Whether to use history or not
  37. */
  38. private boolean withHistory;
  39. private TextRequestsWrapper requestsWrapper;
  40. public WenXinQianFan init() {
  41. Map<String, String> headers = Map.of("Content-Type", "application/json");
  42. this.requestsWrapper = new TextRequestsWrapper(headers);
  43. return this;
  44. }
  45. @Override
  46. public String llmType() {
  47. return "wenxin";
  48. }
  49. public List<String> createStream(String prompt, List<String> stop) {
  50. JSONObject jsonObject = new JSONObject();
  51. jsonObject.put("content",prompt);
  52. jsonObject.put("role","user");
  53. messages.add(jsonObject);
  54. Map<String, Object> payload = Map.of(
  55. "temperature", temperature,
  56. "messages", messages,
  57. "max_length", maxToken,
  58. "stream",stream,
  59. "top_p", topP);
  60. LOG.debug("WenXin payload: {}", payload);
  61. String response = requestsWrapper.post(endpointUrl+this.accessToken, payload);
  62. LOG.debug("WenXin response: {}", response);
  63. return response.lines().toList();
  64. }
  65. @Override
  66. protected LLMResult innerGenerate(List<String> prompts, List<String> stop) {
  67. List<List<GenerationChunk>> generations = new ArrayList<>();
  68. for (String prompt : prompts) {
  69. GenerationChunk finalChunk = null;
  70. for (String streamResp : createStream(prompt, stop)) {
  71. if (StringUtils.isNotEmpty(streamResp)) {
  72. GenerationChunk chunk = streamResponseToGenerationChunk(streamResp);
  73. if (finalChunk == null) {
  74. finalChunk = chunk;
  75. } else {
  76. finalChunk = finalChunk.add(chunk);
  77. }
  78. }
  79. }
  80. generations.add(List.of(requireNonNull(finalChunk)));
  81. }
  82. return new LLMResult(generations);
  83. }
  84. public static GenerationChunk streamResponseToGenerationChunk(String streamResponse) {
  85. String replace = streamResponse.replace("data:", "");
  86. Map<String, Object> parsedResponse = JsonUtils.convertFromJsonStr(replace, new TypeReference<>() {});
  87. String text = (String) parsedResponse.getOrDefault("result", "");
  88. return new GenerationChunk(text, null);
  89. }
  90. }
2.2.2 测试使用

2.2.3 请求结果

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/41924
推荐阅读
相关标签
  

闽ICP备14008679号