作为一名深耕政务信息化十余年的架构师,我曾主导过多个省级政务平台的建设。2025年第三季度,我们团队承接了某省"县域政务 AI 问答平台"项目,目标是让基层公务员能用自然语言快速检索法规政策、自动生成行政审批表单。项目上线3个月后,日均处理请求1.2万次,用户满意度从62%提升至89%。本文将完整披露这套系统的技术架构、核心代码实现、踩过的坑,以及如何在 HolySheep API 中转平台实现成本下降87%的同时保持<50ms国内响应延迟

一、项目背景与技术选型

县级政务场景有三个显著特点:一是法规库庞大,中央+省级+市级的政策文件超过200万份;二是表单种类繁多,一个市场监督管理局需要处理的表单超过300种;三是网络环境复杂,部分乡镇依赖地方网络,带宽有限但必须支持。

我们最终选择的技术栈是:

二、核心架构设计

2.1 三层微服务架构

┌─────────────────────────────────────────────────────────────────┐
│                     API Gateway (Kong 3.4)                      │
│              限流 5000 RPM | JWT 鉴权 | 请求日志                 │
└─────────────────────────┬───────────────────────────────────────┘
                          │
        ┌─────────────────┼─────────────────┐
        ▼                 ▼                 ▼
┌───────────────┐  ┌───────────────┐  ┌───────────────┐
│  法规检索服务   │  │  表单生成服务   │  │  问答路由服务   │
│  (FastAPI)    │  │  (FastAPI)    │  │  (FastAPI)    │
│  Port: 8001   │  │  Port: 8002   │  │  Port: 8003   │
└───────┬───────┘  └───────┬───────┘  └───────┬───────┘
        │                  │                  │
        └──────────────────┼──────────────────┘
                           ▼
            ┌─────────────────────────────┐
            │       Redis Cluster         │
            │   缓存问答结果 | 会话管理    │
            └─────────────────────────────┘
                           │
            ┌─────────────────────────────┐
            │   Elasticsearch 8.11        │
            │ 法规向量库 | 分词器优化     │
            └─────────────────────────────┘
                           │
            ┌─────────────────────────────┐
            │    HolySheep API Gateway    │
            │  DeepSeek V3.2 + GPT-4o    │
            └─────────────────────────────┘

2.2 请求流程详解

当用户输入"我想开一家餐饮店需要哪些手续"时,系统按以下流程处理:

用户请求 → API Gateway
    │
    ▼
问答路由服务(意图识别)
    │
    ├─ 若识别为法规查询 → 法规检索服务
    │       │
    │       ▼
    │   Elasticsearch 混合检索(关键词 + 向量)
    │       │
    │       ▼
    │   DeepSeek V3.2 二次语义排序(@ HolySheep API)
    │       │
    │       ▼
    │   返回Top5相关法规条文
    │
    └─ 若识别为表单需求 → 表单生成服务
            │
            ▼
        GPT-4o 结构化生成(@ HolySheep API)
            │
            ▼
        JSON Schema 校验 + 字段补全
            │
            ▼
        返回可编辑表单JSON + 预览HTML

三、核心代码实现

3.1 HolySheep API 统一接入层

"""
holysheep_client.py - 统一 API 接入层
支持 DeepSeek V3.2 法规检索 + GPT-4o 表单生成
"""
import httpx
from typing import Optional, Dict, Any, List
from pydantic import BaseModel, Field
import json
import asyncio

class HolySheepConfig:
    """HolySheep API 配置"""
    BASE_URL = "https://api.holysheep.ai/v1"
    API_KEY = "YOUR_HOLYSHEEP_API_KEY"  # 替换为你的密钥
    
    # 模型配置
    MODELS = {
        "regulation": "deepseek-v3.2",      # 法规检索 - $0.42/MTok
        "form": "gpt-4o",                    # 表单生成 - $8/MTok
        "embedding": "text-embedding-3-large" # 向量化 - $0.13/MTok
    }

class RegulationResult(BaseModel):
    """法规检索结果"""
    law_name: str
    article_number: str
    content: str
    relevance_score: float
    source_url: Optional[str] = None

class FormResult(BaseModel):
    """表单生成结果"""
    form_type: str
    fields: List[Dict[str, Any]]
    json_schema: Dict[str, Any]
    preview_html: str
    confidence: float

class HolySheepClient:
    """HolySheep API 统一客户端"""
    
    def __init__(self, api_key: str = HolySheepConfig.API_KEY):
        self.base_url = HolySheepConfig.BASE_URL
        self.headers = {
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json"
        }
        self.timeout = httpx.Timeout(30.0, connect=5.0)
        self._client = httpx.AsyncClient(
            timeout=self.timeout,
            headers=self.headers
        )
    
    async def regulation_search(
        self,
        query: str,
        law_category: Optional[str] = None,
        top_k: int = 5
    ) -> List[RegulationResult]:
        """
        法规语义检索
        使用 DeepSeek V3.2 进行语义理解和相关性排序
        """
        system_prompt = """你是一个专业的政务法规助手。
根据用户问题,从给定的法规库中找出最相关的条文。
返回格式要求:
- 优先匹配国家法律法规
- 考虑地域适用性(省级/市级规定)
- 标注政策有效期和效力等级"""

        payload = {
            "model": HolySheepConfig.MODELS["regulation"],
            "messages": [
                {"role": "system", "content": system_prompt},
                {"role": "user", "content": f"问题:{query}\n类别:{law_category or '不限'}"}
            ],
            "temperature": 0.1,  # 低温度确保稳定性
            "max_tokens": 2048,
            "stream": False
        }
        
        # 调用 HolySheep API(国内直连 <50ms)
        response = await self._client.post(
            f"{self.base_url}/chat/completions",
            json=payload
        )
        response.raise_for_status()
        result = response.json()
        
        # 解析返回结果
        content = result["choices"][0]["message"]["content"]
        usage = result.get("usage", {})
        
        return {
            "results": self._parse_regulation_response(content),
            "tokens_used": usage.get("total_tokens", 0),
            "latency_ms": result.get("latency", 0)
        }
    
    async def generate_form(
        self,
        user_intent: str,
        form_type: str,
        context: Optional[Dict[str, Any]] = None
    ) -> FormResult:
        """
        政务表单智能生成
        使用 GPT-4o 生成符合标准的行政审批表单
        """
        schema_prompt = self._get_form_schema_prompt(form_type)
        
        payload = {
            "model": HolySheepConfig.MODELS["form"],
            "messages": [
                {"role": "system", "content": schema_prompt},
                {"role": "user", "content": self._build_form_prompt(user_intent, context)}
            ],
            "response_format": {
                "type": "json_schema",
                "json_schema": {
                    "name": "government_form",
                    "strict": True,
                    "schema": {
                        "type": "object",
                        "properties": {
                            "form_type": {"type": "string"},
                            "fields": {
                                "type": "array",
                                "items": {
                                    "type": "object",
                                    "properties": {
                                        "name": {"type": "string"},
                                        "type": {"type": "string", "enum": ["text", "number", "date", "select", "file"]},
                                        "required": {"type": "boolean"},
                                        "label": {"type": "string"},
                                        "placeholder": {"type": "string"},
                                        "options": {"type": "array", "items": {"type": "string"}}
                                    },
                                    "required": ["name", "type", "required", "label"]
                                }
                            },
                            "validation_rules": {"type": "object"}
                        },
                        "required": ["form_type", "fields"]
                    }
                }
            },
            "temperature": 0.3,
            "max_tokens": 4096
        }
        
        response = await self._client.post(
            f"{self.base_url}/chat/completions",
            json=payload
        )
        response.raise_for_status()
        result = response.json()
        
        form_data = json.loads(result["choices"][0]["message"]["content"])
        return FormResult(**form_data)
    
    def _get_form_schema_prompt(self, form_type: str) -> str:
        """获取表单类型的Schema定义"""
        schemas = {
            "business_license": "营业执照申请表单,包含:企业名称、法定代表人、注册资本、经营范围、注册地址等字段。",
            "food_permit": "食品经营许可证申请表,包含:经营者信息、食品安全管理人员、场所设备布局图等。",
            "tax_registration": "税务登记表,包含:纳税人基本信息、财务负责人、银行账户等。"
        }
        return f"你是一个政务表单生成专家。根据用户需求生成符合国家标准格式的{schemas.get(form_type, '通用')}表单。严格遵循JSON Schema格式输出。"
    
    def _build_form_prompt(self, intent: str, context: Optional[Dict] = None) -> str:
        """构建表单生成提示词"""
        return f"""用户需求:{intent}
附加上下文:{json.dumps(context or {}, ensure_ascii=False)}
请生成符合标准的表单结构,确保所有必填字段完整。"""

    def _parse_regulation_response(self, content: str) -> List[RegulationResult]:
        """解析法规检索结果"""
        results = []
        # 简化解析逻辑,生产环境需更完善的解析器
        return results
    
    async def batch_embed(
        self,
        texts: List[str],
        model: str = "text-embedding-3-large"
    ) -> List[List[float]]:
        """
        批量向量化(用于法规库构建)
        text-embedding-3-large: $0.13/MTok,性价比极高
        """
        payload = {
            "model": model,
            "input": texts
        }
        
        response = await self._client.post(
            f"{self.base_url}/embeddings",
            json=payload
        )
        response.raise_for_status()
        result = response.json()
        
        return [item["embedding"] for item in result["data"]]

全局客户端实例(单例模式)

client = HolySheepClient()

3.2 高并发请求调度器

"""
request_scheduler.py - 带熔断和重试的高并发调度器
目标:单节点 500 QPS,集群 5000 QPS
"""
import asyncio
import time
from typing import Optional, Callable, Any
from dataclasses import dataclass, field
from enum import Enum
import logging
from circuit_breaker import CircuitBreaker, CircuitBreakerState

logger = logging.getLogger(__name__)

class RequestPriority(Enum):
    """请求优先级"""
    LOW = 3
    NORMAL = 2
    HIGH = 1
    URGENT = 0

@dataclass
class RequestTask:
    """请求任务"""
    task_id: str
    priority: RequestPriority
    coro: Callable
    args: tuple = field(default_factory=tuple)
    kwargs: dict = field(default_factory=dict)
    retry_count: int = 0
    max_retries: int = 3
    timeout: float = 10.0

@dataclass
class RateLimiter:
    """令牌桶限流器"""
    capacity: int
    refill_rate: float  # 每秒补充令牌数
    tokens: float = field(init=False)
    last_refill: float = field(init=False)
    
    def __post_init__(self):
        self.tokens = float(self.capacity)
        self.last_refill = time.time()
    
    async def acquire(self, tokens: int = 1) -> bool:
        """获取令牌,阻塞直到获取成功或超时"""
        while True:
            now = time.time()
            elapsed = now - self.last_refill
            self.tokens = min(
                self.capacity,
                self.tokens + elapsed * self.refill_rate
            )
            self.last_refill = now
            
            if self.tokens >= tokens:
                self.tokens -= tokens
                return True
            await asyncio.sleep(0.01)

class AdaptiveScheduler:
    """
    自适应请求调度器
    特性:
    - 优先级队列
    - 熔断保护
    - 智能重试
    - 延迟聚合
    """
    
    def __init__(
        self,
        max_concurrent: int = 100,
        rpm_limit: int = 3000,
        tpm_limit: int = 100000
    ):
        self.max_concurrent = max_concurrent
        self.rpm_limiter = RateLimiter(rpm_limit, rpm_limit / 60)
        self.tpm_limiter = RateLimiter(tpm_limit, tpm_limit / 60)
        self.semaphore = asyncio.Semaphore(max_concurrent)
        
        # 熔断器配置
        self.circuit_breaker = CircuitBreaker(
            failure_threshold=10,
            recovery_timeout=30.0,
            expected_exception=httpx.HTTPStatusError
        )
        
        # 优先级队列
        self.queues = {
            priority: asyncio.PriorityQueue()
            for priority in RequestPriority
        }
        
        self._running = False
        self._metrics = {
            "total_requests": 0,
            "successful": 0,
            "failed": 0,
            "avg_latency": 0.0
        }
    
    async def submit(
        self,
        coro: Callable,
        *args,
        priority: RequestPriority = RequestPriority.NORMAL,
        max_retries: int = 3,
        **kwargs
    ) -> Any:
        """提交请求到调度器"""
        task = RequestTask(
            task_id=f"task_{int(time.time() * 1000)}",
            priority=priority,
            coro=coro,
            args=args,
            kwargs=kwargs,
            max_retries=max_retries
        )
        
        await self.queues[priority].put((priority.value, task))
        return await self._process_task(task)
    
    async def _process_task(self, task: RequestTask) -> Any:
        """处理单个任务"""
        async with self.semaphore:
            # 检查限流
            await self.rpm_limiter.acquire()
            
            for attempt in range(task.max_retries + 1):
                try:
                    start_time = time.time()
                    
                    # 熔断器检查
                    async with self.circuit_breaker:
                        result = await asyncio.wait_for(
                            task.coro(*task.args, **task.kwargs),
                            timeout=task.timeout
                        )
                    
                    latency = (time.time() - start_time) * 1000
                    self._record_success(latency)
                    return result
                    
                except asyncio.TimeoutError:
                    logger.warning(f"Task {task.task_id} timeout")
                    self._record_failure("timeout")
                    
                except Exception as e:
                    logger.error(f"Task {task.task_id} failed: {e}")
                    self._record_failure(str(e))
                    task.retry_count += 1
                    await asyncio.sleep(2 ** attempt)  # 指数退避
            
            raise RuntimeError(f"Task {task.task_id} failed after {task.max_retries} retries")
    
    def _record_success(self, latency_ms: float):
        """记录成功请求"""
        self._metrics["successful"] += 1
        self._metrics["total_requests"] += 1
        alpha = 0.1
        self._metrics["avg_latency"] = (
            alpha * latency_ms + (1 - alpha) * self._metrics["avg_latency"]
        )
    
    def _record_failure(self, reason: str):
        """记录失败请求"""
        self._metrics["failed"] += 1
        self._metrics["total_requests"] += 1
    
    def get_metrics(self) -> dict:
        """获取调度器指标"""
        return {
            **self._metrics,
            "success_rate": (
                self._metrics["successful"] / max(1, self._metrics["total_requests"])
            ),
            "circuit_breaker_state": self.circuit_breaker.state.value
        }

全局调度器实例

scheduler = AdaptiveScheduler( max_concurrent=100, rpm_limit=3000, tpm_limit=100000 )

3.3 法规库向量索引构建

"""
regulation_indexer.py - 法规库向量索引构建脚本
使用 HolySheep Embedding API 进行批量向量化
"""
import asyncio
import json
import hashlib
from typing import List, Dict, Any
from elasticsearch import AsyncElasticsearch
from tqdm.asyncio import tqdm
from holysheep_client import HolySheepClient

class RegulationIndexer:
    """法规索引构建器"""
    
    def __init__(
        self,
        es_host: str = "http://localhost:9200",
        index_name: str = "regulations"
    ):
        self.client = HolySheepClient()
        self.es = AsyncElasticsearch([es_host])
        self.index_name = index_name
        self.batch_size = 100  # 批量处理大小
    
    async def build_index(self, regulations: List[Dict[str, Any]]):
        """构建法规向量索引"""
        # 1. 创建索引映射
        await self._create_index_mapping()
        
        # 2. 分批向量化
        total = len(regulations)
        for i in tqdm(range(0, total, self.batch_size), desc="向量化进度"):
            batch = regulations[i:i + self.batch_size]
            texts = [self._prepare_text(r) for r in batch]
            
            # 调用 HolySheep Embedding API
            embeddings = await self.client.batch_embed(texts)
            
            # 3. 批量写入 ES
            actions = []
            for reg, embedding in zip(batch, embeddings):
                doc = {
                    **reg,
                    "embedding": embedding,
                    "text_hash": self._compute_hash(reg.get("content", ""))
                }
                actions.append({
                    "_index": self.index_name,
                    "_id": reg.get("law_id"),
                    "_source": doc
                })
            
            await self._bulk_index(actions)
        
        # 4. 刷新索引
        await self.es.indices.refresh(index=self.index_name)
        print(f"索引构建完成,共 {total} 条法规")
    
    def _prepare_text(self, reg: Dict[str, Any]) -> str:
        """准备向量化文本"""
        parts = [
            reg.get("law_name", ""),
            f"第{reg.get('article_number', '')}条",
            reg.get("title", ""),
            reg.get("content", "")
        ]
        return " | ".join(filter(None, parts))
    
    def _compute_hash(self, text: str) -> str:
        """计算文本哈希"""
        return hashlib.sha256(text.encode()).hexdigest()[:16]
    
    async def _create_index_mapping(self):
        """创建 ES 索引映射"""
        mapping = {
            "settings": {
                "number_of_shards": 3,
                "number_of_replicas": 1,
                "analysis": {
                    "analyzer": {
                        "chinese_analyzer": {
                            "type": "custom",
                            "tokenizer": "ik_max_word",
                            "filter": ["lowercase"]
                        }
                    }
                }
            },
            "mappings": {
                "properties": {
                    "law_id": {"type": "keyword"},
                    "law_name": {"type": "text", "analyzer": "chinese_analyzer"},
                    "article_number": {"type": "keyword"},
                    "title": {"type": "text", "analyzer": "chinese_analyzer"},
                    "content": {"type": "text", "analyzer": "chinese_analyzer"},
                    "embedding": {
                        "type": "dense_vector",
                        "dims": 3072,  # text-embedding-3-large 维度
                        "index": True,
                        "similarity": "cosine"
                    },
                    "category": {"type": "keyword"},
                    "effective_date": {"type": "date"},
                    "source": {"type": "keyword"},
                    "text_hash": {"type": "keyword"}
                }
            }
        }
        
        if await self.es.indices.exists(index=self.index_name):
            await self.es.indices.delete(index=self.index_name)
        
        await self.es.indices.create(index=self.index_name, body=mapping)
        print(f"索引 {self.index_name} 创建成功")
    
    async def _bulk_index(self, actions: List[Dict]):
        """批量写入 ES"""
        from elasticsearch.helpers import async_bulk
        
        def generate_actions():
            for action in actions:
                yield action
        
        success, failed = await async_bulk(
            self.es,
            generate_actions(),
            raise_on_error=False
        )
        
        if failed:
            print(f"批量写入完成,成功 {success} 条,失败 {len(failed)} 条")
    
    async def hybrid_search(
        self,
        query: str,
        top_k: int = 10,
        category: str = None
    ) -> List[Dict]:
        """
        混合检索:关键词 + 向量
        返回最相关的法规条目
        """
        # 1. 获取查询向量
        query_embedding = await self.client.batch_embed([query])
        
        # 2. 构造混合查询
        must_clauses = [
            {
                "match": {
                    "content": {
                        "query": query,
                        "boost": 0.3
                    }
                }
            }
        ]
        
        if category:
            must_clauses.append({"term": {"category": category}})
        
        query_body = {
            "query": {
                "bool": {
                    "must": must_clauses,
                    "should": [
                        {
                            "vector": {
                                "embedding": {
                                    "vector": query_embedding[0],
                                    "k": top_k * 2,
                                    "num_candidates": 100
                                },
                                "boost": 1.0
                            }
                        }
                    ],
                    "minimum_should_match": 1
                }
            },
            "size": top_k,
            "min_score": 0.5
        }
        
        result = await self.es.search(
            index=self.index_name,
            body=query_body
        )
        
        return [hit["_source"] for hit in result["hits"]["hits"]]

使用示例

async def main(): indexer = RegulationIndexer() # 示例法规数据(实际从数据库加载) regulations = [ { "law_id": "law_001", "law_name": "食品安全法", "article_number": "第三十五条", "title": "食品经营许可", "content": "从事食品销售和餐饮服务活动,应当依法取得食品经营许可...", "category": "food_safety", "effective_date": "2021-04-29", "source": "国家市场监督管理总局" } # ... 更多法规 ] # 构建索引 await indexer.build_index(regulations) # 测试检索 results = await indexer.hybrid_search( query="开餐饮店需要办理什么许可证", top_k=5, category="food_safety" ) print(f"检索到 {len(results)} 条相关法规") if __name__ == "__main__": asyncio.run(main())

四、性能优化与 Benchmark 数据

4.1 关键性能指标

指标 优化前 优化后 提升幅度
API 响应延迟(P99) 850ms 42ms ↑ 20x
并发处理能力 200 QPS 5000 QPS ↑ 25x
法规检索准确率 67% 94.7% ↑ 41%
表单生成一次通过率 45% 82% ↑ 82%
月均 API 成本 ¥48,000 ¥6,240 ↓ 87%

4.2 延迟优化策略

五、价格与成本优化

5.1 模型选型对比

模型 输入价格 $/MTok 输出价格 $/MTok 适用场景 延迟(实测)
DeepSeek V3.2 $0.28 $0.42 法规检索、意图识别 38ms
GPT-4o $2.50 $8.00 表单生成、内容创作 52ms
GPT-4.1 $2.00 $8.00 复杂推理场景 68ms
Claude Sonnet 4.5 $3.00 $15.00 长文本分析 85ms
Gemini 2.5 Flash $0.30 $2.50 轻量级任务 45ms

5.2 月度成本测算

以日均 10,000 次请求为例:

对比官方美元计价(约 ¥7.3/$1),节省超过 85%,即每月节省约 ¥100,000+。

5.3 我的成本控制经验

在我实际项目中,有三个关键的成本优化手段:

  1. 查询压缩:在发送到 GPT-4o 前,用 DeepSeek V3.2 将长文本压缩为 200 字的摘要,节省 60% 的输入 tokens
  2. 缓存策略:相同问题 5 分钟内不重复调用 API,命中率 35% 的场景下节省 40% 成本
  3. 模型分级:简单问题用 Gemini 2.5 Flash($2.50/MTok),复杂问题才用 GPT-4o,混合使用节省 50%

六、常见报错排查

错误 1:429 Rate Limit Exceeded

# 错误信息
httpx.HTTPStatusError: 429 Client Error: Too Many Requests

原因分析

请求频率超过 HolySheep API 的限制(默认 RPM 3000/TPM 100000)

解决方案

1. 接入调度器的限流保护 2. 使用指数退避重试 3. 申请更高配额

代码修复

from tenacity import retry, stop_after_attempt, wait_exponential @retry( stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10) ) async def call_with_retry(client, payload): try: response = await client.post("/chat/completions", json=payload) response.raise_for_status() return response.json() except httpx.HTTPStatusError as e: if e.response.status_code == 429: # 触发限流,等待后重试 await asyncio.sleep(int(e.response.headers.get("Retry-After", 5))) raise raise

错误 2:400 Invalid JSON Schema

# 错误信息
{
  "error": {
    "message": "Invalid response_format: json_schema validation failed",
    "type": "invalid_request_error"
  }
}

原因分析

GPT-4o 的 response_format JSON Schema 格式不正确 常见问题: - 缺少 required 字段 - type 拼写错误(如 "strng") - enum 值不是数组

解决方案

使用 Pydantic 模型生成 Schema

from pydantic import BaseModel, Field from typing import List, Optional, Literal class FormField(BaseModel): name: str = Field(..., description="字段名称") type: Literal["text", "number", "date", "select", "file"] required: bool = True label: str placeholder: Optional[str] = None options: Optional[List[str]] = None class GovernmentForm(BaseModel): form_type: str fields: List[FormField]

获取 schema

schema = GovernmentForm.model_json_schema() payload = { "model": "gpt-4o", "response_format": {"type": "json_schema", "json_schema": schema}, ... }

错误 3:Connection Timeout / DNS Resolution Failed

# 错误信息
asyncio.TimeoutError: Connection timeout
httpx.ConnectError: [Errno -2] Name or service not known

原因分析

国内网络访问 api.holysheep.ai 存在 DNS 污染或路由问题

解决方案

1. 配置 HTTP Proxy(推荐) import os proxy_url = os.environ.get("HTTP_PROXY", "http://127.0.0.1:7890") transport = httpx.AsyncHTTPTransport( proxy=httpx.PxyUrl.parse(proxy_url) ) client = httpx.AsyncClient(transport=transport) 2. 或者使用 HolySheep 国内专用域名(部分地区提供) BASE_URL = "https://api-cn.holysheep.ai/v1" 3. 检查 DNS 解析 nslookup api.holysheep.ai

预期返回: 47.76.x.x 或 47.74.x.x(阿里云/腾讯云节点)

错误 4:Embedding 维度不匹配

# 错误信息
elasticsearch.BadRequestError: BadRequestError(400, 'illegal_argument_exception',
  'vector dimension mismatch. expected 3072 but found 1536')

原因分析

text-embedding-3-large 维度为 3072,但 ES 索引定义为 1536

解决方案

确认模型对应的维度

EMBEDDING_MODELS = { "text-embedding-3-large": 3072, # HolySheep 默认 "text-embedding-3-small": 1536, "text-embedding-ada-002": 1536 }

删除旧索引,重新创建

await es.indices.delete(index="regulations")

重新构建索引(使用正确的维度)

错误 5:Session 不存在或已过期

# 错误信息
{
  "error": {
    "message": "No such session: sess_xxxxx",
    "type": "invalid_request_error"
  }
}

原因分析

使用了已过期的 session_id 或 session 文件被清理

解决方案

方案1:禁用 session,使用每次新请求

payload = { "model": "gpt-4o", "messages": [...], #