95 lines
2.4 KiB
Go
95 lines
2.4 KiB
Go
|
|
package handler
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"tcm-agent/internal/agent"
|
|||
|
|
|
|||
|
|
"github.com/gin-gonic/gin"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// KnowledgeHandler 知识库接口处理器
|
|||
|
|
// 提供:检索知识库、上传文档等能力
|
|||
|
|
type KnowledgeHandler struct {
|
|||
|
|
agentRunner *agent.Runner
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// NewKnowledgeHandler 创建知识库处理器
|
|||
|
|
func NewKnowledgeHandler(runner *agent.Runner) *KnowledgeHandler {
|
|||
|
|
return &KnowledgeHandler{agentRunner: runner}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// SearchRequest 知识检索请求
|
|||
|
|
type SearchRequest struct {
|
|||
|
|
Query string `json:"query" binding:"required"` // 检索关键词
|
|||
|
|
TopK int `json:"top_k"` // 返回条数(默认5)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Search 检索知识库
|
|||
|
|
// POST /api/v1/knowledge/search
|
|||
|
|
//
|
|||
|
|
// 直接调用MaxKB的RAG检索能力
|
|||
|
|
// 用于:查询方剂组成、药典条目、诊疗规范等
|
|||
|
|
func (h *KnowledgeHandler) Search(c *gin.Context) {
|
|||
|
|
var req SearchRequest
|
|||
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|||
|
|
c.JSON(400, gin.H{"error": "查询关键词不能为空"})
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if req.TopK <= 0 {
|
|||
|
|
req.TopK = 5
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 调用MaxKB检索
|
|||
|
|
answer, err := h.agentRunner.MaxKB().Chat(c.Request.Context(), req.Query)
|
|||
|
|
if err != nil {
|
|||
|
|
c.JSON(500, gin.H{
|
|||
|
|
"error": "知识库检索失败",
|
|||
|
|
"detail": err.Error(),
|
|||
|
|
})
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
c.JSON(200, gin.H{
|
|||
|
|
"code": 200,
|
|||
|
|
"data": gin.H{
|
|||
|
|
"query": req.Query,
|
|||
|
|
"answer": answer,
|
|||
|
|
"source": "MaxKB RAG",
|
|||
|
|
"top_k": req.TopK,
|
|||
|
|
},
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// IngestRequest 文档上传请求
|
|||
|
|
type IngestRequest struct {
|
|||
|
|
Title string `json:"title" binding:"required"` // 文档标题
|
|||
|
|
Content string `json:"content" binding:"required"` // 文档内容
|
|||
|
|
Category string `json:"category"` // 分类(方剂/药典/指南/病历模板)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Ingest 上传文档到知识库
|
|||
|
|
// POST /api/v1/knowledge/ingest
|
|||
|
|
//
|
|||
|
|
// 将文档写入MaxKB知识库,触发自动向量化
|
|||
|
|
// 支持后续RAG检索
|
|||
|
|
func (h *KnowledgeHandler) Ingest(c *gin.Context) {
|
|||
|
|
var req IngestRequest
|
|||
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|||
|
|
c.JSON(400, gin.H{"error": "标题和内容不能为空"})
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 实际项目中调用MaxKB的文档上传API
|
|||
|
|
// 这里返回模拟成功
|
|||
|
|
c.JSON(200, gin.H{
|
|||
|
|
"code": 200,
|
|||
|
|
"message": "文档已加入知识库队列",
|
|||
|
|
"data": gin.H{
|
|||
|
|
"title": req.Title,
|
|||
|
|
"category": req.Category,
|
|||
|
|
"status": "pending_vectorization",
|
|||
|
|
"note": "实际项目请调用MaxKB文档上传API",
|
|||
|
|
},
|
|||
|
|
})
|
|||
|
|
}
|