好久没有写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

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐