当前位置: 首页 > 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);
    }

    @Bean
    public EmbeddingStore embeddingStore() {
        return new InMemoryEmbeddingStore();
    }

    @Bean
    public 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的启动类中添加代码:

    @Bean
    CommandLineRunner 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);

        };
    }

测试后运行结果如下:

相关文章:

  • 杀戮尖塔(Slay The Spire) 的全新角色模组 - 女巫
  • 乐观锁与悲观锁的使用场景
  • updateById()、update()、lambdaUpdate()字段更新为null,失效的解决方案
  • 数据库的历史与发展
  • pyqtgraph.opengl.items.GLSurfacePlotItem.GLSurfacePlotItem 报了一个错
  • 头歌数据库【数据库概论】第10-11章 故障恢复与并发控制
  • 文件上传、读取与包含漏洞解析及防御实战
  • 原创工具scoopex - scoop增强工具,提供github proxy和url净化功能
  • C++ 蓝桥云课代码练习
  • 基于springboot钻孔数据管理系统的设计与实现(源码+lw+部署文档+讲解),源码可白嫖!
  • 安装 Calico 的两种主流方式对比
  • 21 天 Python 计划:MySQL视图、触发器、存储过程、函数与流程控制
  • 创建两个进程
  • P9241 [蓝桥杯 2023 省 B] 飞机降落(dfs)
  • 售货机管理系统:智慧零售时代的运营新引擎
  • Android开发鸿蒙环境问题记录
  • LangChain4j实现rag
  • SQL解析器:实现进阶功能
  • IAR推动嵌入式开发:云就绪、可扩展的CI/CD和可持续自动化
  • 青少年编程考试 CCF GESP Python七级认证真题 2025年3月
  • 自助建站的优势/百度推广找谁做靠谱
  • b2b网站制作平台/广告开户
  • 网站建设维护杭州/百度网盘搜索引擎入口在哪里
  • 百度收录万网空间的网站需要多久/百度网站排名优化
  • ps做网站的视频/外贸推广网站
  • 做网站自动赚钱吗/佛山旺道seo优化