当前位置: 首页 > news >正文

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

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

一、项目背景

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

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





二、技术架构

2.1 技术栈

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

2.2 系统架构图

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

三、核心功能实现

3.1 数据库设计

知识库主表
CREATETABLEknowledge_base(id BIGSERIALPRIMARYKEY,nameTEXTNOTNULL,descriptionTEXT,categoryTEXT,statusINTEGERNOTNULLDEFAULT1,create_timeTIMESTAMPDEFAULTCURRENT_TIMESTAMP,update_timeTIMESTAMPDEFAULTCURRENT_TIMESTAMP);
知识库分块表(支持向量检索)
CREATETABLEknowledge_chunks(id BIGSERIALPRIMARYKEY,knowledge_doc_idBIGINTNOTNULL,chunk_idTEXTNOTNULL,contentTEXTNOTNULL,extTEXT,statusINTEGERNOTNULLDEFAULT1,created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP,updated_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP,embedding vector(1536)-- 向量字段);

3.2 RAG检索增强生成

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

// RAG服务核心代码func(r*RAGService)AnswerStream(ctx context.Context,querystring,sendEventfunc(string))error{// 1. 向量检索相关文档docs,err:=r.Retrieve(ctx,query,r.TopK)iferr!=nil{returnerr}// 2. 构建System PromptsystemPrompt:=buildQAPrompt(query,docs)// 3. 流式调用大模型returnCallLLMStream(systemPrompt,query,func(chunkstring){sendEvent(chunk)// 实时推送})}

3.3 向量检索优化

func(r*RAGService)Retrieve(ctx context.Context,querystring,topKint)([]models.LawDocument,error){// 生成查询向量(带缓存)emb,err:=r.getOrGenerateEmbedding(query)iferr!=nil{returnnil,err}vardocs[]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).Errorreturndocs,err}

3.4 PDF知识库构建

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

func(s*PDFUploadService)UploadPDFWithKnowledgeBase(ctx context.Context,knowledgeBaseIDuint,fileNamestring,fileData[]byte,)(int,error){// 1. 提取PDF文本text,err:=ExtractTextFromPDF(fileData)// 2. 文本分块(每块500字符,重叠50字符)chunks:=ChunkText(text,500,50)// 3. 生成向量并批量入库for_,chunk:=rangechunks{embedding,_:=GenerateEmbedding(chunk.Content)chunkModel:=models.KnowledgeChunk{Content:chunk.Content,Embedding:embedding,}chunkModels=append(chunkModels,chunkModel)}// 4. 批量插入数据库returns.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(datastring){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:pg16environment:POSTGRES_USER:postgresPOSTGRES_PASSWORD:yourpasswordPOSTGRES_DB:market_intelports:-"5432:5432"volumes:-postgres_data:/var/lib/postgresql/dataapp:build:.ports:-"8080:8080"depends_on:-postgresenvironment:DB_HOST:postgresQIANWEN_API_KEY:${QIANWEN_API_KEY}

4.2 启动命令

# 设置环境变量exportQIANWEN_API_KEY=sk-xxx# 一键启动docker-composeup-d# 查看日志docker-composelogs-fapp

五、核心优化策略

5.1 向量缓存机制

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

varembeddingCache=cache.New(5*time.Minute,10*time.Minute)func(r*RAGService)getOrGenerateEmbedding(textstring)([]float64,error){ifcached,found:=embeddingCache.Get(text);found{returncached.([]float64),nil}emb,err:=GenerateEmbedding(text)iferr==nil{embeddingCache.Set(text,emb,cache.DefaultExpiration)}returnemb,err}

5.2 相似度阈值过滤

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

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

5.3 PDF文本清理

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

funcsanitizeUTF8(sstring)string{if!utf8.ValidString(s){s=strings.ToValidUTF8(s,"�")}varresult strings.Builderfor_,r:=ranges{ifr==utf8.RuneError{continue}result.WriteRune(r)}returnresult.String()}

六、性能测试结果

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

七、项目亮点

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

八、总结

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

未来将持续优化:

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

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

http://www.jsqmd.com/news/557484/

相关文章:

  • Arduino双超声波避障机器人库设计与实践
  • 【开题答辩全过程】以 校园帮系统为例,包含答辩的问题和答案
  • 告别‘Hello World’:用Gin框架从零搭建一个带用户登录和文件上传的Web服务(Go 1.21+)
  • Java轻量级边缘运行时深度解析(OpenJDK GraalVM Substrate VM在ARM64 IoT设备上的实测压测报告)
  • 具身智能元年已至?智元机器人量产上汽产线,人形机器人不再“只会跳舞”
  • 基于python的学生选课成绩信息管理系统vue
  • OpenClaw办公自动化:GLM-4.7-Flash驱动的周报生成系统
  • 【C语言微项目】通讯录
  • 深入EDKII源码:手把手拆解Redfish DXE Driver如何与BMC的Redis数据库“对话”
  • Linux期末突击:从体系结构到VFS,一张图搞定所有简答题
  • 保山同城相亲交友平台
  • TypeScript——模块解析
  • 技术赋能时序预测:Kronos多模态序列建模框架的跨行业实践指南
  • 从零开始制作专业字幕:开源工具Subtitle Edit完全指南
  • Unity UI性能优化实战:Sprite Atlas图集打包配置全流程(含V1/V2模式选择与避坑指南)
  • OpenClaw隐私保护方案:nanobot本地模型处理敏感数据实战
  • 终极指南:使用Textstat Python库进行文本可读性分析的完整教程
  • TypeScript——声明合并
  • 学术圈大地震!CCF号召抵制NeurIPS,国产AI如何重构科研话语权?
  • HT1621B驱动LCD屏实战:从硬件连接到代码调试全流程(附常见问题排查)
  • HTML---基本标签2
  • 泛型的难点解释
  • 2026智慧综合能源方案优质品牌推荐指南:能耗计量电表/远程抄表电表/远程电力抄表/逆流监测电表/零碳园区能源方案/选择指南 - 优质品牌商家
  • 使用GeoTools把Geojson转换成Shp文件
  • 新手必看!华为云Nginx服务搭建从入门到放弃的5个关键步骤
  • 面向对象的I²C驱动封装设计与实现
  • TypeScript——编译器和编译选项
  • 降AI率工具语义重构技术解读:为何能有效降论文AIGC率
  • 从Corner到Scenario:一次讲透MCMM中工艺角(ss/tt/ff)与场景绑定的实战配置
  • 从零开始搭建苍穹外卖项目:手把手教你配置前后端开发环境(含Nginx避坑指南)