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",
|
||
},
|
||
})
|
||
}
|