Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

一个Java 8+的LangChain实现。在(企业)Java环境中构建强大的基于LLM的应用程序。附带详细的Java入门的LLM学习课程

Notifications You must be signed in to change notification settings

Starcloud-Cloud/java-langchain

Open more actions menu

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

58 Commits
58 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Java-langchain 介绍

🦜️ Java-langchain: 一个Java 8+的LangChain实现。在(企业)Java环境中构建强大的基于LLM的应用程序。同时包含了详细的Java入门的LLM学习课程。

  • 使用说明
  • Java入门LLM开发课程 Doc

使用说明

1. 为什么要开发?

这是Java语言实现的LangChain。

大型语言模型(llm)正在作为一种变革性技术出现,使开发人员能够构建以前无法构建的应用程序。但是单独使用这些llm通常不足以创建一个真正强大的应用程序 当你可以将它们与其他计算或知识来源相结合时,真正的功能就会出现。

这个库旨在帮助开发这类应用程序和帮助Java开发迅速学习到LLM开发的必要知识。

下面的例子可以在课程中查看 doc-example

2. 使用示例

  • 待整理

3. 集成

3.1 LLMs

3.2 向量存储

3.3 智能体

  • 智能体 只使用GPT4去实现了,是现在效果的最好的方案。

4. 快速入门指南

本教程向您快速介绍如何使用LangChain构建端到端语言模型应用程序。

4.1 Maven

  1. 将JitPack仓库添加到构建文件中
<repositories>
    <repository>
         <id>jitpack.io</id>
         <url>https://jitpack.io</url>
    </repository>
</repositories>
  1. 增加依赖
<dependency>
    <groupId>com.github.Starcloud-Cloud</groupId>
    <artifactId>java-langchain</artifactId>
    <version>v1.0.1</version>
</dependency>

查看最新版本 version

配置

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,它接收文本并生成更多的文本。

OpenAI llm = new OpenAI();
log.info("result : {}", llm.call("Hi there! what you name?"));

现在我们可以传入文本并得到预测!

result : 
My name is Priya.

4.3 聊天

聊天模型是语言模型的一种变体。虽然聊天模型在底层使用语言模型,但它们公开的接口有点不同:它们公开的不是“文本输入,文本输出”的API,而是一个以“聊天消息”为输入和输出的接口。

ChatOpenAI chatOpenAI = new ChatOpenAI();
log.info("result: {}", JSONUtil.toJsonStr(chatOpenAI.predictMessages(Arrays.asList(new HumanMessage("hi, what you name?")))));
 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接口访问它。

ChatOpenAI chatOpenAI = new ChatOpenAI();
log.info(chatOpenAI.predict("hi, what you name?"));
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。通常,他们会将用户输入添加到一个更大的文本中,称为提示模板,它为手头的特定任务提供额外的上下文。

在前面的例子中,我们传递给模型的文本包含了生成公司名称的指令。对于我们的应用程序,如果用户只需要提供公司/产品的描述,而不必担心给出模型指令,那就太好了。

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);
promptValue:StringPromptValue(str=What is a good name for a company that makes colorful socks?)

4.5 语言链

现在我们有了一个model和一个prompt模板,我们想要将两者结合起来。链为我们提供了一种链接(或链接)多个基元的方法,如模型、提示符和其他链。

更多示例内容: Chains

4.6 智能体

我们的第一个链运行预先确定的步骤序列。为了处理复杂的工作流,我们需要能够根据输入动态地选择操作。

智能体就是这样做的:它们使用语言模型来确定采取哪些行动以及以什么顺序进行。智能体可以访问工具,它们重复选择工具,运行工具,并观察输出,直到它们提出最终答案。

ChatOpenAI chatOpenAI = new ChatOpenAI();

//这里我们将参数temperature设置为0.0,从而减少生成答案的随机性。
chatOpenAI.setTemperature(0.0);

List<BaseTool> 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

4.7 记忆

到目前为止,我们看到的链和代理都是无状态的,但对于许多应用程序来说,必须引用过去的交互。显然,这就是聊天机器人的情况,你希望它在过去消息的上下文中理解新消息。

内存模块提供了一种维护应用程序状态的方法。基本内存接口很简单:它允许您根据最新的运行输入和输出更新状态,并允许您使用存储状态修改(或上下文化)下一个输入。

有许多内置的存储系统。其中最简单的是一个缓冲存储器,它只是将最后几个输入/输出添加到当前输入

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

5. 千问大模型

支持最新的VL接口

        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

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

About

一个Java 8+的LangChain实现。在(企业)Java环境中构建强大的基于LLM的应用程序。附带详细的Java入门的LLM学习课程

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages

Morty Proxy This is a proxified and sanitized view of the page, visit original site.