背景
最近公司的AI项目有个新的需求:当向大模型提问时,大模型可能无法回答这个问题,领导感觉体验不好,打算引入搜索的功能,即在大模型回答不了问题的情况下,通过一些搜索引擎提供的api去搜索相关的答案返回给客户。 目前比较流行的框架是langchain, 由于我们公司在调用模型时是利用大模型提供的rest api相关的文档通过Java的Httpclient去调用的,因此考虑引入python不太合适。因此公司专职研究人员提供了langchain4j框架,基本是Java版的langchain,本人就公司的这个搜索需求做了一个初使用的记录,供大家参考。
准备工作
创建一个spring boot的项目, 版本3.2+, jdk使用的是17
参考文档: https://docs.langchain4j.dev/ (langchain4j官方)
目前langchain4j支持十几种大模型。
编码工作
导入langchain4j与spring boot整合的最基本的依赖:
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-spring-boot-starter</artifactId>
<version>0.35.0</version>
</dependency>
上述只是整合最基本的依赖,如果需要使用具体的大模型,那么还需要导入具体模型的整合依赖,如open ai:
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
<version>0.35.0</version>
</dependency>
基本格式是:langchain4j-{integration-name}-spring-boot-starter
langchain官方提供了两种实现方式,一种叫low-level,针对每个模型都提供一个模型实现类的方式来和模型进行会话。另外一种是通过AI Services方式进行。下面分别简单演示一下这两种方式工作的代码。
low-level
ChatLanguageModel:这个是该框架提供的一个大模型接口,有很多不同的实现,比如open ai的实现类是:OpenAiChatModel。
当然也有支持流式输出的StreamingChatLanguageModel接口,对应的具体大模型也有相应的实现类。
官方给出了示例:
这里ChatLanguageModel需要是一个spring的bean,因此需要改一下以上这种写法,也不能直接在ChatLanguageModel的对象上加@Autowired注解。因此可以通过配置类来实现(以open ai为例):
@Configuration
public class ChatLanguageModelConfig {
/**
* 非流式
* @return
*/
@Bean
public ChatLanguageModel openAiChatModel() {
//如果使用了代理必须要传入代理信息
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 7777));
return OpenAiChatModel.builder()
.</