package service import ( "context" "fmt" "rag/common/eino" "rag/model/dto" "github.com/cloudwego/eino/components/retriever" "github.com/cloudwego/eino/schema" "github.com/gogf/gf/v2/os/glog" "github.com/gogf/gf/v2/util/gconv" ) var RAGQuery = new(ragQueryService) type ragQueryService struct{} // Query 执行RAG查询 func (s *ragQueryService) Query(ctx context.Context, req *dto.RAGQueryReq) (*dto.RAGQueryRes, error) { if req.TopK <= 0 { req.TopK = 5 } // 4. 使用向量检索器进行查询 r, err := eino.NewPGVectorRetriever(&eino.PGVectorRetrieverConfig{ Embedder: eino.EmbedderDashscope, DefaultTopK: req.TopK, }) if err != nil { glog.Errorf(ctx, "初始化向量检索器失败: %v", err) return nil, fmt.Errorf("初始化向量检索器失败: %w", err) } // 5. 执行向量检索 docs, err := r.Retrieve(ctx, req.Content, retriever.WithEmbedding(eino.EmbedderDashscope), retriever.WithDSLInfo(map[string]any{ "dataset_ids": req.DatasetIds, })) if err != nil { glog.Errorf(ctx, "向量检索失败: %v", err) return nil, fmt.Errorf("向量检索失败: %w", err) } messages := make([]*schema.Message, 0) err = gconv.Struct(req.History, &messages) if err != nil { glog.Errorf(ctx, "转换历史消息失败: %v", err) return nil, fmt.Errorf("转换历史消息失败: %w", err) } replyMsg, err := eino.NewChatModel(ctx, req.Content, docs, messages) if err != nil { glog.Errorf(ctx, "向量检索失败: %v", err) return nil, fmt.Errorf("向量检索失败: %w", err) } return &dto.RAGQueryRes{ Answer: replyMsg.Content, }, nil }