问题推荐
本文档详细介绍了校园领域搜索问答系统中的问题推荐功能模块的设计与实现。该模块旨在通过智能推荐相关问题,提升用户的查询体验和系统的响应效率。本文将涵盖接口设计、数据库表结构以及相关的 Java 实现代码。
功能概述
问题推荐模块主要负责根据用户的查询上下文,智能地推荐相关的问题,帮助用户快速找到所需信息。具体功能包括:
- 智能推荐:根据用户当前的查询内容,推荐最相关的问题。
- 数据管理:管理推荐问题的数据,包括问题内容、图标、标题等。
- 接口提供:提供 RESTful API,供前端或其他服务调用,获取推荐问题。
接口设计
获取推荐问题接口
请求方法:GET
接口路径:/api/v1/chat/recommend
请求参数:
参数 | 类型 | 描述 | 是否必填 |
---|---|---|---|
num | int | 推荐问题的数量 | 否 |
响应格式:
{
"data": [
{
"avatar": "https://firebasestorage.googleapis.com/v0/b/rumi-bdb43.appspot.com/o/public%2Ftmp%2Fimg_v3_02cd_bd6fe904-94f1-4986-9d65-0175e22746eh.png?alt=media",
"title": "课程与教授",
"content": "我们有没有推荐的适合R区域的简单课程?"
},
{
"avatar": "https://firebasestorage.googleapis.com/v0/b/rumi-bdb43.appspot.com/o/public%2Ftmp%2Fimg_v3_02cd_7b40632d-d0f6-4328-99ce-2e36d966709h.png?alt=media",
"title": "作业帮助",
"content": "SJSU主校区附近有哪些最好的或有名的餐厅?"
},
{
"avatar": "https://firebasestorage.googleapis.com/v0/b/rumi-bdb43.appspot.com/o/public%2Ftmp%2Fimg_v3_02cd_32d2f8af-a364-4a10-a9b0-4a5d6686b27h.png?alt=media",
"title": "校园导览",
"content": "如何注册课程,以及注册的截止日期和程序是什么?"
},
{
"avatar": "https://firebasestorage.googleapis.com/v0/b/rumi-bdb43.appspot.com/o/public%2Ftmp%2Fimg_v3_02cd_e638ecb7-73d6-45d4-805d-001f2065142h.png?alt=media",
"title": "校园生活",
"content": "学生可以免费进入橄榄球比赛吗?"
}
],
"code": 1,
"msg": null,
"ok": true
}
Java 实现代码
服务层实现
LlmQuestionRecommendService
类负责与数据库交互,获取推荐问题数据。
package com.litongjava.llm.service;
import com.litongjava.db.TableInput;
import com.litongjava.db.TableResult;
import com.litongjava.db.activerecord.Row;
import com.litongjava.max.blog.consts.TableNames;
import com.litongjava.model.page.Page;
import com.litongjava.table.services.ApiTable;
public class LlmQuestionRecommendService {
/**
* 获取推荐问题分页数据
*
* @param num 推荐问题的数量
* @return 分页结果包含推荐问题列表
*/
public TableResult<Page<Row>> page(Integer num) {
TableInput ti = TableInput.create();
ti.columns("avatar,title,content")
.orderBy("orders")
.pageSize(num)
.set("deleted", 0);
TableResult<Page<Row>> result = ApiTable.page(TableNames.llm_question_recommend, ti);
return result;
}
}
代码说明:
方法:
page(Integer num)
该方法接受一个整数参数num
,表示需要获取的推荐问题数量。通过构建TableInput
对象,指定需要查询的字段(avatar
,title
,content
)、排序字段(orders
)、分页大小(pageSize
)以及过滤条件(deleted = 0
)。数据查询:调用
ApiTable.page
方法,传入表名llm_question_recommend
和构建好的查询条件,获取分页结果。
处理层实现
ApiChatHandler
类负责处理 HTTP 请求,调用服务层获取数据,并构建响应。
package com.litongjava.llm.handler;
import java.util.List;
import java.util.stream.Collectors;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.jfinal.kit.Kv;
import com.litongjava.db.TableResult;
import com.litongjava.db.activerecord.Row;
import com.litongjava.jfinal.aop.Aop;
import com.litongjava.llm.service.LlmQuestionRecommendService;
import com.litongjava.model.body.RespBodyVo;
import com.litongjava.model.page.Page;
import com.litongjava.tio.boot.http.TioRequestContext;
import com.litongjava.tio.http.common.HttpRequest;
import com.litongjava.tio.http.common.HttpResponse;
import com.litongjava.tio.http.server.util.CORSUtils;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class ApiChatHandler {
/**
* 处理推荐问题请求
*
* @param request HTTP请求对象
* @return HTTP响应对象
*/
public HttpResponse recommend(HttpRequest request) {
// 获取响应对象
HttpResponse response = TioRequestContext.getResponse();
// 启用CORS
CORSUtils.enableCORS(response);
// 获取请求参数num,默认值为4
Integer num = request.getInt("num");
if (num == null) {
num = 4;
}
// 调用服务层获取推荐问题数据
TableResult<Page<Row>> tr = Aop.get(LlmQuestionRecommendService.class).page(num);
RespBodyVo respBodyVo;
if (tr.isOk()) {
// 获取数据列表
List<Row> list = tr.getData().getList();
// 将Row转换为Kv对象
List<Kv> kvs = list.stream().map(Row::toKv).collect(Collectors.toList());
// 构建成功响应
respBodyVo = RespBodyVo.ok(kvs);
} else {
// 构建失败响应
respBodyVo = RespBodyVo.fail(tr.getMsg());
}
// 设置响应的JSON内容
return response.setJson(respBodyVo);
}
}
代码说明:
方法:
recommend(HttpRequest request)
该方法处理/api/v1/chat/recommend
的 GET 请求。CORS 配置:调用
CORSUtils.enableCORS(response)
方法,启用跨域资源共享,允许前端跨域访问。参数处理:从请求中获取参数
num
,如果未提供,则默认推荐 4 个问题。服务调用:通过
Aop.get(LlmQuestionRecommendService.class).page(num)
调用服务层方法,获取推荐问题数据。响应构建:
- 如果服务调用成功(
tr.isOk()
为true
),则将获取到的数据列表转换为键值对列表(List<Kv>
),并封装在RespBodyVo.ok(kvs)
中。 - 如果服务调用失败,则封装失败信息在
RespBodyVo.fail(tr.getMsg())
中。
- 如果服务调用成功(
返回响应:将封装好的
RespBodyVo
对象设置为响应的 JSON 内容,并返回。
总结
本文档详细介绍了校园领域搜索问答系统中问题推荐功能模块的设计与实现。通过设计合理的数据库表结构、定义清晰的 API 接口以及实现高效的服务和处理层代码,该模块能够智能地为用户推荐相关问题,提升用户体验和系统的响应效率。未来,可以进一步优化推荐算法,结合用户行为数据,实现更加个性化的推荐服务。