基于Go + 千问大模型 + pgvector构建市场监管智能问答智能体

一、项目背景

随着"放管服"改革的深入推进,市场监管领域政策法规不断更新,企业和公众对政策咨询的需求日益增长。传统的政策咨询模式存在响应慢、效率低、准确性差等问题,已无法满足新时代市场监管的需求。

本文基于Go语言、千问大模型、pgvector向量数据库和RAG技术,构建了一套完整的市场监管智能问答智能体系统,实现法规智能解析、执法文书自动生成、知识库管理等核心功能。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

二、技术架构

2.1 技术栈

技术组件 选型 说明
后端框架 Go Gin 高性能Web框架,支持SSE流式输出
ORM框架 GORM Go语言最流行的ORM库
数据库 PostgreSQL + pgvector 关系数据库 + 向量检索扩展
大模型 千问大模型(Qwen) 阿里云通义千问,支持流式调用
前端框架 Vue 3 + Element Plus 现代化前端框架,良好的用户体验
部署容器 Docker + Docker Compose 一键部署,环境隔离

2.2 系统架构图

┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│   前端Vue   │────▶│   Gin服务   │────▶│   PostgreSQL│
│  ElementUI  │◀────│  (SSE流式)  │◀────│  +pgvector  │
└─────────────┘     └─────────────┘     └─────────────┘
                           │
                           ▼
                    ┌─────────────┐
                    │  千问大模型  │
                    │  (Qwen API) │
                    └─────────────┘

三、核心功能实现

3.1 数据库设计

知识库主表
CREATE TABLE knowledge_base (
    id          BIGSERIAL PRIMARY KEY,
    name        TEXT NOT NULL,
    description TEXT,
    category    TEXT,
    status      INTEGER NOT NULL DEFAULT 1,
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
知识库分块表(支持向量检索)
CREATE TABLE knowledge_chunks (
    id                BIGSERIAL PRIMARY KEY,
    knowledge_doc_id  BIGINT NOT NULL,
    chunk_id          TEXT NOT NULL,
    content           TEXT NOT NULL,
    ext               TEXT,
    status            INTEGER NOT NULL DEFAULT 1,
    created_at        TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at        TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    embedding         vector(1536)  -- 向量字段
);

3.2 RAG检索增强生成

RAG的核心思想是在大模型生成答案前,先从知识库中检索相关文档,作为上下文输入给大模型,从而提升回答的准确性和专业性。

// RAG服务核心代码
func (r *RAGService) AnswerStream(ctx context.Context, query string, sendEvent func(string)) error {
    // 1. 向量检索相关文档
    docs, err := r.Retrieve(ctx, query, r.TopK)
    if err != nil {
        return err
    }

    // 2. 构建System Prompt
    systemPrompt := buildQAPrompt(query, docs)

    // 3. 流式调用大模型
    return CallLLMStream(systemPrompt, query, func(chunk string) {
        sendEvent(chunk)  // 实时推送
    })
}

3.3 向量检索优化

func (r *RAGService) Retrieve(ctx context.Context, query string, topK int) ([]models.LawDocument, error) {
    // 生成查询向量(带缓存)
    emb, err := r.getOrGenerateEmbedding(query)
    if err != nil {
        return nil, err
    }

    var docs []models.LawDocument
    // 使用pgvector的余弦距离排序,并过滤低相似度结果
    err = r.DB.WithContext(ctx).
        Model(&models.LawDocument{}).
        Select("id, title, content, source").
        Where("embedding <=> ? < ?", pgvector.NewVector(emb), r.SimilarityThreshold).
        Order("embedding <=> ?", pgvector.NewVector(emb)).
        Limit(topK).
        Find(&docs).Error

    return docs, err
}

3.4 PDF知识库构建

系统支持上传PDF文档,自动解析、分块、向量化后存入知识库:

func (s *PDFUploadService) UploadPDFWithKnowledgeBase(
    ctx context.Context,
    knowledgeBaseID uint,
    fileName string,
    fileData []byte,
) (int, error) {
    // 1. 提取PDF文本
    text, err := ExtractTextFromPDF(fileData)
    
    // 2. 文本分块(每块500字符,重叠50字符)
    chunks := ChunkText(text, 500, 50)
    
    // 3. 生成向量并批量入库
    for _, chunk := range chunks {
        embedding, _ := GenerateEmbedding(chunk.Content)
        chunkModel := models.KnowledgeChunk{
            Content:   chunk.Content,
            Embedding: embedding,
        }
        chunkModels = append(chunkModels, chunkModel)
    }
    
    // 4. 批量插入数据库
    return s.DB.CreateInBatches(chunkModels, 100).Error
}

3.5 SSE流式输出

为了提升用户体验,系统采用SSE(Server-Sent Events)实现大模型答案的实时流式输出:

func (qc *QAController) Ask(c *gin.Context) {
    // 设置SSE响应头
    c.Writer.Header().Set("Content-Type", "text/event-stream")
    c.Writer.Header().Set("Cache-Control", "no-cache")
    c.Writer.Header().Set("Connection", "keep-alive")
    
    sendEvent := func(data string) {
        c.Writer.Write([]byte(fmt.Sprintf("data: %s\n\n", data)))
        c.Writer.Flush()
    }
    
    // 调用流式问答
    qc.RAG.AnswerStream(c.Request.Context(), req.Question, sendEvent)
}

四、项目部署

4.1 Docker Compose一键部署

version: '3.8'

services:
  postgres:
    image: pgvector/pgvector:pg16
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: yourpassword
      POSTGRES_DB: market_intel
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data

  app:
    build: .
    ports:
      - "8080:8080"
    depends_on:
      - postgres
    environment:
      DB_HOST: postgres
      QIANWEN_API_KEY: ${QIANWEN_API_KEY}

4.2 启动命令

# 设置环境变量
export QIANWEN_API_KEY=sk-xxx

# 一键启动
docker-compose up -d

# 查看日志
docker-compose logs -f app

五、核心优化策略

5.1 向量缓存机制

对于相同或相似的问题,缓存查询向量,减少API调用:

var embeddingCache = cache.New(5*time.Minute, 10*time.Minute)

func (r *RAGService) getOrGenerateEmbedding(text string) ([]float64, error) {
    if cached, found := embeddingCache.Get(text); found {
        return cached.([]float64), nil
    }
    emb, err := GenerateEmbedding(text)
    if err == nil {
        embeddingCache.Set(text, emb, cache.DefaultExpiration)
    }
    return emb, err
}

5.2 相似度阈值过滤

只返回余弦距离低于阈值的文档,避免低质量结果影响回答质量:

Where("embedding <=> ? < ?", pgvector.NewVector(emb), 0.8)

5.3 PDF文本清理

处理PDF提取中的编码问题,确保文本有效的UTF-8:

func sanitizeUTF8(s string) string {
    if !utf8.ValidString(s) {
        s = strings.ToValidUTF8(s, "�")
    }
    var result strings.Builder
    for _, r := range s {
        if r == utf8.RuneError {
            continue
        }
        result.WriteRune(r)
    }
    return result.String()
}

六、性能测试结果

测试场景 响应时间 说明
向量检索 <50ms 使用pgvector HNSW索引
大模型首字 <2s 千问大模型首Token延迟
PDF上传(10MB) <15s 含解析、分块、向量化
并发问答(10) <3s 平均响应时间

七、项目亮点

  1. 智能问答:基于RAG技术,打破传统关键词检索局限,实现"即问即答"
  2. 执法辅助:自动识别违法行为,生成《检查记录表》《责令整改通知书》等执法文书
  3. 语音驱动:支持语音输入,实现"一语即中的"的监管新模式
  4. 知识库持续优化:通过用户反馈机制,不断优化提示词和知识库质量
  5. 流式输出:SSE技术实现实时响应,用户体验流畅

八、总结

本文基于Go语言和千问大模型,结合RAG技术,构建了一套完整的市场监管智能问答系统。系统实现了法规智能解析、执法文书自动生成、知识库管理、语音输入等核心功能,有效提升了市场监管咨询服务的响应效率和准确度。

未来将持续优化:

  • 引入更多大模型适配(如GPT、Claude)
  • 增加多轮对话能力
  • 优化向量检索算法(HNSW索引)
  • 实现用户行为分析和个性化推荐

作者简介:资深后端开发工程师,专注于Go语言、大模型应用和云原生技术。欢迎技术交流。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐