springboot接入ragflow api

好久没有写java代码了,好多都忘了。这次使用springboot+openfeign远程接入ragflow的api,其实是个挺简单的项目,我还写了好久。现在记一下大致的坑。

和智能体对话

ragflow的官方文档上有好几个和agent的对接的url,分别是:

  1. Create agent completion
  2. Create session with agent
  3. Converse with agent

问了豆包,这三者的区别是:

维度Create agent completionCreate session with agentConverse with agent
状态管理无状态,单次请求创建会话,返回 sessionId基于 sessionId 维护上下文
参数要求无需 sessionId无需 sessionId,返回 sessionId必须包含 sessionId
上下文支持无,每次请求独立处理初始化上下文(如欢迎消息)继承会话历史,支持多轮依赖
适用场景简单查询、无上下文依赖多轮对话初始化、复杂流程启动多轮交互、上下文关联问答
典型请求示例单次问答、文本生成客服欢迎语、知识库加载分步骤引导、历史对话关联查询

经过我的实际应用,想要对话只要用Create session with agent就ok了。

Create session with agent

api文档里,Create session with agent部分有两个url:

  1. /api/v1/agents/{agent_id}/sessions
  2. /api/v1/agents/{agent_id}/sessions?user_id={user_id}

第一个是全租户都可以使用的,第二个是指定租户id才可以使用的,我目前就用第一个,第二个目前情况遇不到。

可能是我老了,下面的代码中,@PathVariable对应的参数名不对居然过了一天才发现。

@PostMapping(
            path = "/api/v1/agents/{agentId}/completions",
            consumes = MediaType.APPLICATION_JSON_VALUE,
            produces = MediaType.APPLICATION_JSON_VALUE
    )
    String converseWithAgent(
            //@PathVariable("agent_id") String agentId, 
            @PathVariable("agentId") String agentId,
            @RequestHeader("Authorization") String authHeader,
            @RequestBody(required = false) Map<String, Object> requestBody
    );

请求返回格式

http的正常返回格式如下:

data:{
    "code": 0,
    "message": "",
    "data": {
        "answer": "Hi! I'm your smart assistant. What can I do for you?",
        "reference": {},
        "id": "31e6091d-88d4-441b-ac65-eae1c055be7b",
        "session_id": "2987ad3eb85f11efb2a70242ac120005"
    }
}
data:{
    "code": 0,
    "message": "",
    "data": true
}

这个格式其实并不是JSON格式,问了豆包说这个格式是Server-Sent Events (SSE),我当时以为是json解析了半天报错总是改不了。累了
我想将返回内容以我创建好的对象接收,将“data:”部分切掉就好了:

String[] responses = response.split("\n");
            List<RagflowResponse<Map<String, Object>>> ragflowResponseList = new ArrayList<>();
            for(String r : responses){
                if(r.startsWith("data:")){
                    r = r.substring(5).trim();
                    JSONObject json = JSONObject.parseObject(r);
                    System.out.println(json);
                    RagflowResponse<Map<String, Object>> ragflowResponse = JSON.toJavaObject(json, RagflowResponse.class);
                    ragflowResponseList.add(ragflowResponse);
                }
            }

这里代码是先将整个response按行切割,因为传入的是多行数据。接下来使用循环将每个json转对象

先记这么多,其他的后面再说

END

<think>好的,用户想了解如何在Spring Boot中实现或集成RAGFlow。首先,我需要确定RAGFlow具体指的是什么。RAG通常指“Retrieval-Augmented Generation”,即检索增强生成,常用于结合信息检索和生成模型来提升回答质量。但用户提到的RAGFlow可能是一个特定的工具或框架,需要进一步确认。 接下来,我应该检查用户提供的引用内容,看看是否有相关线索。引用内容主要涉及Spring Boot的版本迁移、配置属性、Mockito注解变更以及Maven插件,这些可能与集成第三方库或服务有关,但并没有直接提到RAGFlow。因此,可能需要假设用户指的是实现RAG模式,而非特定产品。 如果用户的目标是实现RAG模式,那么在Spring Boot中需要整合以下几个部分:检索系统(如Elasticsearch或向量数据库)、生成模型(如Hugging Face或OpenAI的API),以及业务流程控制。需要指导用户如何集成这些组件,可能涉及依赖配置、Bean定义、服务层实现等。 另外,用户提供的引用中提到了@EnableConfigurationProperties,这可能与配置外部服务的API密钥或连接参数有关。例如,配置生成模型的API密钥时,可以使用@ConfigurationProperties注解的类来管理这些配置。 还需要考虑测试方面的内容,引用3提到@MockBean和@SpyBean被弃用,建议使用@MockitoBean等,这可能影响单元测试的编写,尤其是在模拟检索服务或生成模型时。 总结步骤可能包括:添加相关依赖(如Spring AI、Elasticsearch客户端),配置属性,实现检索服务,集成生成模型,编写业务逻辑,处理异常,以及测试。同时需要确保代码示例符合Spring Boot的最新实践,比如使用正确的注解和配置方式。 最后,生成相关问题时要覆盖潜在的用户需求,如性能优化、扩展性、安全性等,帮助用户深入理解整个集成过程。</think>在Spring Boot中实现RAG(Retrieval-Augmented Generation)流程需要整合检索系统与生成模型,以下是分步实现方案: ### 一、基础架构设计 1. **模块划分**: - 检索层:使用Elasticsearch或向量数据库(如Milvus) - 生成层:集成LLM(如Hugging Face/OpenAI) - 业务层:Spring Boot控制器与服务 2. **技术栈选择**: ```xml <!-- Spring AI 集成 --> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-openai-spring-boot-starter</artifactId> <version>0.8.1</version> </dependency> <!-- Elasticsearch --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> ``` ### 二、检索系统集成 1. **配置向量存储**: ```java @Configuration public class ElasticsearchConfig { @Bean RestHighLevelClient elasticClient() { return new RestHighLevelClient( RestClient.builder(new HttpHost("localhost", 9200, "http")) ); } } ``` 2. **文档处理服务**: ```java @Service public class DocumentRetriever { private final VectorStore vectorStore; public List<Document> retrieve(String query, int topK) { return vectorStore.similaritySearch(query, topK); } } ``` ### 三、生成模型集成 1. **配置生成模型**: ```yaml spring: ai: openai: api-key: ${OPENAI_API_KEY} chat: model: gpt-4 ``` 2. **生成服务实现**: ```java @Service public class GenerationService { private final ChatClient chatClient; public String generateResponse(String prompt, List<Document> context) { String augmentedPrompt = buildPrompt(prompt, context); return chatClient.call(augmentedPrompt); } private String buildPrompt(String query, List<Document> docs) { return String.format("基于以下信息:%s\n回答问题:%s", docs.stream().map(Document::getContent).collect(Collectors.joining("\n")), query); } } ``` ### 四、业务层整合 1. **REST控制器**: ```java @RestController @RequestMapping("/rag") public class RagController { private final DocumentRetriever retriever; private final GenerationService generator; @PostMapping("/ask") public ResponseEntity<String> processQuery(@RequestBody String query) { List<Document> context = retriever.retrieve(query, 3); return ResponseEntity.ok(generator.generateResponse(query, context)); } } ``` ### 五、配置管理 使用类型安全配置(参考引用[2]): ```java @ConfigurationProperties(prefix = "rag") public record RagConfig( int defaultTopK, String systemPromptTemplate ) {} ``` 在启动类添加: ```java @EnableConfigurationProperties(RagConfig.class) ``` ### 六、测试策略(参考引用[3]) ```java @SpringBootTest class RagFlowTest { @MockitoBean VectorStore mockVectorStore; @Autowired GenerationService generationService; @Test void should_return_response_with_context() { when(mockVectorStore.similaritySearch(anyString(), anyInt())) .thenReturn(List.of(new Document("测试内容"))); String response = generationService.generateResponse("测试问题", List.of()); assertThat(response).contains("测试内容"); } } ``` ### 七、部署注意事项 1. 使用Spring Boot Maven插件打包(参考引用[4]): ```bash mvn spring-boot:build-image ``` 2. 配置健康检查端点: ```yaml management: endpoints: web: exposure: include: health,info ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值