好久没有写java代码了,好多都忘了。这次使用springboot+openfeign远程接入ragflow的api,其实是个挺简单的项目,我还写了好久。现在记一下大致的坑。
和智能体对话
ragflow的官方文档上有好几个和agent的对接的url,分别是:
- Create agent completion
- Create session with agent
- Converse with agent
问了豆包,这三者的区别是:
维度 | Create agent completion | Create session with agent | Converse with agent |
---|---|---|---|
状态管理 | 无状态,单次请求 | 创建会话,返回 sessionId | 基于 sessionId 维护上下文 |
参数要求 | 无需 sessionId | 无需 sessionId,返回 sessionId | 必须包含 sessionId |
上下文支持 | 无,每次请求独立处理 | 初始化上下文(如欢迎消息) | 继承会话历史,支持多轮依赖 |
适用场景 | 简单查询、无上下文依赖 | 多轮对话初始化、复杂流程启动 | 多轮交互、上下文关联问答 |
典型请求示例 | 单次问答、文本生成 | 客服欢迎语、知识库加载 | 分步骤引导、历史对话关联查询 |
经过我的实际应用,想要对话只要用Create session with agent就ok了。
Create session with agent
api文档里,Create session with agent部分有两个url:
- /api/v1/agents/{agent_id}/sessions
- /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转对象
先记这么多,其他的后面再说