# java-langchain
**Repository Path**: mstitop/java-langchain
## Basic Information
- **Project Name**: java-langchain
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2023-11-23
- **Last Updated**: 2024-04-10
## Categories & Tags
**Categories**: Uncategorized
**Tags**: chatGPT
## README
# Java-langchain 介绍
🦜️ Java-langchain: 一个Java 8+的LangChain实现。在(企业)Java环境中构建强大的基于LLM的应用程序。同时包含了详细的Java入门的LLM学习课程。
- 使用说明
- Java入门LLM开发课程 [Doc](https://github.com/Starcloud-Cloud/java-langchain/tree/master/doc)
# 使用说明
## 1. 为什么要开发?
这是Java语言实现的LangChain。
大型语言模型(llm)正在作为一种变革性技术出现,使开发人员能够构建以前无法构建的应用程序。但是单独使用这些llm通常不足以创建一个真正强大的应用程序
当你可以将它们与其他计算或知识来源相结合时,真正的功能就会出现。
这个库旨在帮助开发这类应用程序和帮助Java开发迅速学习到LLM开发的必要知识。
下面的例子可以在课程中查看 [doc-example](https://github.com/Starcloud-Cloud/java-langchain/tree/master/doc)
## 2. 使用示例
- 待整理
## 3. 集成
### 3.1 LLMs
- [OpenAI](src/test/java/com/starcloud/ops/llm/langchain/core/llm/OpenAITest.java), (support stream)
- [千义通问](src/test/java/com/starcloud/ops/llm/langchain/core/llm/ChatQwenAITest.java)
### 3.2 向量存储
- [Mysql]()
- [Elasticsearch]()
### 3.3 智能体
- 智能体 只使用GPT4去实现了,是现在效果的最好的方案。
## 4. 快速入门指南
本教程向您快速介绍如何使用LangChain构建端到端语言模型应用程序。
### 4.1 Maven
1. 将JitPack仓库添加到构建文件中
```xml
jitpack.io
https://jitpack.io
```
2. 增加依赖
```xml
com.github.Starcloud-Cloud
java-langchain
v1.0.1
```
查看最新版本 [version](https://jitpack.io/#Starcloud-Cloud/java-langchain)
[](https://jitpack.io/#Starcloud-Cloud/java-langchain)
### 配置
```xml
starcloud-langchain.model.llm.openai.apiKey=sk-xxx
starcloud-langchain.model.llm.openai.timeOut=30
#千问配置
starcloud-langchain.model.llm.qwen.apiKey=xxxx
#向量支持,使用elasticsearch
starcloud-llm.vector.store=elasticsearch
#elasticsearch 地址
starcloud.elasticsearch.uris=xxx.xxx.xxx.xxx:9200
#elasticsearch 索引
starcloud.elasticsearch.index.name=xxxxxx
#GPT使用代理配置
starcloud-langchain.model.llm.openai.proxyHosts[0]=xxxxxx
starcloud-langchain.model.llm.openai.proxyHosts[1]=xxxxxx
starcloud-langchain.model.llm.openai.proxyPort=xxxxx
#serpapi(google搜索) 服务的key, https://serpapi.com/playground
starcloud-langchain.tools.serpapi.apiKey=xxxxxx
```
### 4.2 LLMs
从语言模型获得预测结果。LangChain的基本构建块是LLM,它接收文本并生成更多的文本。
```java
OpenAI llm = new OpenAI();
log.info("result : {}", llm.call("Hi there! what you name?"));
```
现在我们可以传入文本并得到预测!
```shell
result :
My name is Priya.
```
### 4.3 聊天
聊天模型是语言模型的一种变体。虽然聊天模型在底层使用语言模型,但它们公开的接口有点不同:它们公开的不是“文本输入,文本输出”的API,而是一个以“聊天消息”为输入和输出的接口。
```java
ChatOpenAI chatOpenAI = new ChatOpenAI();
log.info("result: {}", JSONUtil.toJsonStr(chatOpenAI.predictMessages(Arrays.asList(new HumanMessage("hi, what you name?")))));
```
```shell
result: {"content":"Hello! I am an AI language model developed by OpenAI, and I don't have a personal name. However, you can call me GPT-3 or ChatGPT if you'd like! How can I assist you today?","additionalArgs":{}}
```
了解聊天模型与普通LLM的不同之处是很有用的,但如果能够将它们同等对待,通常也会很方便。LangChain还公开了一个接口,可以通过它与聊天模型进行交互,就像普通的LLM一样。你可以通过`predict`接口访问它。
```java
ChatOpenAI chatOpenAI = new ChatOpenAI();
log.info(chatOpenAI.predict("hi, what you name?"));
```
```shell
Hello! I am an AI language model developed by OpenAI, so I don't have a personal name. You can call me OpenAI Assistant. How can I assist you today?
```
### 4.4 提示词模版
大多数LLM应用程序不会将用户输入直接传递给LLM。通常,他们会将用户输入添加到一个更大的文本中,称为提示模板,它为手头的特定任务提供额外的上下文。
在前面的例子中,我们传递给模型的文本包含了生成公司名称的指令。对于我们的应用程序,如果用户只需要提供公司/产品的描述,而不必担心给出模型指令,那就太好了。
```java
PromptTemplate promptTemplate = PromptTemplate.fromTemplate("What is a good name for a company that makes {product}?");
PromptValue promptValue = promptTemplate.formatPrompt(Arrays.asList(
BaseVariable.newString("product", "colorful socks")
));
log.info("promptValue:{}", promptValue);
```
```shell
promptValue:StringPromptValue(str=What is a good name for a company that makes colorful socks?)
```
### 4.5 语言链
现在我们有了一个model和一个prompt模板,我们想要将两者结合起来。链为我们提供了一种链接(或链接)多个基元的方法,如模型、提示符和其他链。
更多示例内容: [Chains](src/test/java/com/starcloud/ops/llm/langchain/learning/langchain/code/Chains.java)
### 4.6 智能体
我们的第一个链运行预先确定的步骤序列。为了处理复杂的工作流,我们需要能够根据输入动态地选择操作。
智能体就是这样做的:它们使用语言模型来确定采取哪些行动以及以什么顺序进行。智能体可以访问工具,它们重复选择工具,运行工具,并观察输出,直到它们提出最终答案。
```java
ChatOpenAI chatOpenAI = new ChatOpenAI();
//这里我们将参数temperature设置为0.0,从而减少生成答案的随机性。
chatOpenAI.setTemperature(0.0);
List tools = LoadTools.loadTools(Arrays.asList(CalculatorTool.class), chatOpenAI);
OpenAIFunctionsAgent baseSingleActionAgent = OpenAIFunctionsAgent.fromLLMAndTools(chatOpenAI, tools);
AgentExecutor agentExecutor = AgentExecutor.fromAgentAndTools(tools, chatOpenAI, baseSingleActionAgent, baseSingleActionAgent.getCallbackManager());
agentExecutor.run("计算300的25%");
```
更多示例内容: [Agent](src/test/java/com/starcloud/ops/llm/langchain/learning/langchain/code/Agent.java)
### 4.7 记忆
到目前为止,我们看到的链和代理都是无状态的,但对于许多应用程序来说,必须引用过去的交互。显然,这就是聊天机器人的情况,你希望它在过去消息的上下文中理解新消息。
内存模块提供了一种维护应用程序状态的方法。基本内存接口很简单:它允许您根据最新的运行输入和输出更新状态,并允许您使用存储状态修改(或上下文化)下一个输入。
有许多内置的存储系统。其中最简单的是一个缓冲存储器,它只是将最后几个输入/输出添加到当前输入
```java
ConversationBufferWindowMemory memory = new ConversationBufferWindowMemory(1);
memory.saveContext(BaseVariable.newString("input", "你好,我叫皮皮鲁"), BaseVariable.newString("output", "你好啊,我叫鲁西西"));
log.info("loadMemoryVariables: {}", memory.loadMemoryVariables());
memory.saveContext(BaseVariable.newString("input", "很高兴和你成为朋友!"), BaseVariable.newString("output", "是的,让我们一起去冒险吧!"));
log.info("loadMemoryVariables: {}", memory.loadMemoryVariables());
```
更多示例内容: [Memory](src/test/java/com/starcloud/ops/llm/langchain/learning/langchain/code/Memory.java)
## 5. 千问大模型
支持最新的VL接口
```java
ChatVLQwen chatVLQwen = new ChatVLQwen();
chatVLQwen.setTopP(0.9D);
//汉堡图
log.info(chatVLQwen.call(Arrays.asList(com.starcloud.ops.llm.langchain.core.schema.message.multimodal.HumanMessage.
ofImages("描述下图片的时间,地点,人物,场景和意境,不要增加图片上没有的东西!!!",
Arrays.asList("https://download.hotsalecloud.com/mofaai/images/upload/d49b75339e8542a09b66bf71d04f541c.jpg?x-oss-process=image/resize,m_lfit,w_448,h_448"))
)
)
);
//汉堡图
log.info(chatVLQwen.call(Arrays.asList(com.starcloud.ops.llm.langchain.core.schema.message.multimodal.HumanMessage.
ofImages("为图片配上一个符合图片场景和意境的标题和副标题,标题在5个中文字内,让人看到有购买欲。输出格式:```" +
"标题: \r\n" +
"副标题: ```",
Arrays.asList("https://download.hotsalecloud.com/mofaai/images/upload/d49b75339e8542a09b66bf71d04f541c.jpg?x-oss-process=image/resize,m_lfit,w_448,h_448"))
)
)
);
```
## 6. 支持
不要犹豫,尽管问!
如果你在java-langchain中发现一个bug,[打开一个issue](https://github.com/Starcloud-Cloud/java-langchain/issues)
## 7. 贡献
这是一个活跃的开源项目。我们始终向想要使用该系统或为其做出贡献的人开放。请注意,pull requests应该合并到**dev**分支中。
如果您正在寻找适合您技能的实施任务,请联系我。
---
# 版本更新
### 2024/2/6 `v1.0.7`
支持千问VL模型接口
---
# Java入门LLM开发课程
课程总共包含4大部分内容, 内容循序渐进,适合Java同学第一次接触大语言模型的应用开发过程。
对应的代码也放在了`test/learning` 内容
1. 面向开发者的提示工程 (promptdevelopment)
2. 搭建基于 ChatGPT 的问答系统 (chagptapi)
3. 使用 LangChain 开发应用程序 (langchain)
4. 使用 LangChain 访问个人数据(开发中)
学习入口: [Doc](https://github.com/Starcloud-Cloud/java-langchain/tree/master/doc)