当前位置: 首页 > news >正文

LangChain4j(7):Springboot集成LangChain4j实现知识库RAG

我们之前的直接整合进SpringBoot进行实战,最终其实还会将查询到的内容,和对话上下文组合起来,发给LLM为我们组织语言进行回答:

  1. 配置一个Content Retriever 内容检索器,提供向量数据库和向量模型及其他参数
  2. 将内容检索器绑定到AiServices
  3. 当我们进行LLM对话时,底层会自动为我们检索向量数据库进行回答

基于之前的springboot进行添加:

在Aiconfig中添加Assistant:

    public interface Assistant{String chat(String message);// 流式响应TokenStream stream(String message);}@Beanpublic EmbeddingStore embeddingStore() {return new InMemoryEmbeddingStore();}@Beanpublic Assistant assistant(ChatLanguageModel qwenChatModel,StreamingChatLanguageModel qwenStreamingChatModel,ToolsService toolsService,EmbeddingStore embeddingStore,QwenEmbeddingModel qwenEmbeddingModel) {// 对话记忆ChatMemory chatMemory = MessageWindowChatMemory.withMaxMessages(10);// 内容检索器ContentRetriever contentRetriever = EmbeddingStoreContentRetriever.builder().embeddingStore(embeddingStore).embeddingModel(qwenEmbeddingModel).maxResults(5) // 最相似的5个结果.minScore(0.6) // 只找相似度在0.6以上的内容.build();// 为Assistant动态代理对象  chat  --->  对话内容存储ChatMemory----> 聊天记录ChatMemory取出来 ---->放入到当前对话中Assistant assistant = AiServices.builder(Assistant.class).tools(toolsService).contentRetriever(contentRetriever).chatLanguageModel(qwenChatModel).streamingChatLanguageModel(qwenStreamingChatModel).chatMemory(chatMemory).build();return  assistant;}

添加端口代码:

    @RequestMapping(value = "/memory_stream_chat",produces ="text/stream;charset=UTF-8")public Flux<String> memoryStreamChat(@RequestParam(defaultValue="我是谁") String message, HttpServletResponse response) {TokenStream stream = assistant.stream(message);return Flux.create(sink -> {stream.onPartialResponse(s -> sink.next(s)).onCompleteResponse(c -> sink.complete()).onError(sink::error).start();});}

由于是测试,我们直接将代码存放到缓存,但是在实际开发中建议将代码存放的向量数据库中,这边Springboot的启动类中添加代码:

    @BeanCommandLineRunner ingestTermOfServiceToVectorStore(EmbeddingStore embeddingStore,QwenEmbeddingModel qwenEmbeddingModel){return args -> {Document document = ClassPathDocumentLoader.loadDocument("rag/terms-of-service.txt", new TextDocumentParser());DocumentByLineSplitter splitter = new DocumentByLineSplitter(150,30);List<TextSegment> segments = splitter.split(document);// 向量化List<Embedding> embeddings = qwenEmbeddingModel.embedAll(segments).content();// 存入embeddingStore.addAll(embeddings,segments);};}

测试后运行结果如下:


http://www.mrgr.cn/news/97739.html

相关文章:

  • dify文本生成图片
  • 探索 Shell 中的扩展通配符:从 Bash 到 Zsh
  • Linux: 线程控制
  • 嵌入式系统中如何构建事件响应架构
  • Windows 图形显示驱动开发-WDDM 2.0功能_分配用法跟踪
  • 设计模式之桥接、组合、装饰模式
  • Java BigInteger 详解
  • 蓝桥杯-小明的彩灯(Java-差分)
  • 【小沐杂货铺】基于Three.JS绘制太阳系Solar System(GIS 、WebGL、vue、react,提供全部源代码)
  • 刷题 | 牛客 - js简单10题(更ing)1/10知识点解答
  • 美团Leaf分布式ID生成器:雪花算法原理与应用
  • ·DCDC电源模块学习
  • 蓝桥杯-最大数目
  • SpringBoot和微服务学习记录Day1
  • MySQL介绍及使用
  • 【leetcode hot 100 118】杨辉三角
  • 蓝桥杯-蓝桥幼儿园(Java-并查集)
  • 【小沐杂货铺】基于Three.JS绘制三维数字地球Earth(GIS 、WebGL、vue、react,提供全部源代码)
  • 前端-项目工程化(快速理解并会用)
  • 前端知识点---闭包(javascript)