初始化
This commit is contained in:
94
internal/handler/knowledge_handler.go
Normal file
94
internal/handler/knowledge_handler.go
Normal file
@@ -0,0 +1,94 @@
|
||||
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",
|
||||
},
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user