乔人尹 - LLM
type: channel
link: https://underestimated.cn/tag/LLM/
items: LLM 应用架构：从原型到生产
items: LLM 评估：如何知道模型有多强？

LLM 应用架构：从原型到生产
type: item
date: 2025-08-23T15:28:00+00:00
description: 前言：Demo 到生产的鸿沟你做了一个 LLM 应用的 Demo：# Demo 版本：100 行代码搞定 response = openai.chat.completions.create( model="gpt-4", messages=[{"role": "user", "content": user_input}] ) print(response.choices[0].message.content)但生产环境需要考虑：mindmap root((生产环境考量)) 性能 延迟 吞吐量 并发 可靠性 错误处理 重试机制 降级方案 成本 Token 优化 模型选择 缓存策略 安全 输入输出过滤 权限控制 审计日志 可观测 监控 日志 追踪一、整体架构设计1.1 典型 LLM 应用架构flowchart TB subgraph 客户端 Web[Web 应用] Mobile[移动应用] API[API 调用] end subgraph 网关层 LB[负载均衡] Gateway[API Gateway] Auth[认证授权] RateLimit[限流] end subgraph 业务层 Router[请求路由] InputProc[输入处理] OutputProc[输出处理] Cache[缓存层] end subgraph LLM层 Orchestrator[编排层] LLM1[GPT-4] LLM2[Claude] LLM3[本地模型] RAG[RAG 服务] Agent[Agent 服务] end subgraph 数据层 VectorDB[(向量数据库)] RelDB[(关系数据库)] Redis[(Redis)] MQ[消息队列] end subgraph 可观测性 Log[日志] Metrics[指标] Trace[追踪] end Web --> LB Mobile --> LB API --> LB LB --> Gateway Gateway --> Auth Auth --> RateLimit RateLimit --> Router Router --> InputProc InputProc --> Cache Cache --> Orchestrator Orchestrator --> LLM1 Orchestrator --> LLM2 Orchestrator --> LLM3 Orchestrator --> RAG Orchestrator --> Agent RAG --> VectorDB OutputProc --> Cache Router -.-> Log Orchestrator -.-> Metrics LLM1 -.-> Trace1.2 核心组件说明组件作用推荐技术API Gateway认证、限流、路由Kong, Nginx, AWS API Gateway编排层LLM 调用逻辑LangChain, 自研缓存层减少重复调用Redis, Memcached向量数据库RAG 检索Milvus, Pinecone, Chroma消息队列异步处理Kafka, RabbitMQ, Redis可观测性监控追踪Prometheus, Grafana, Jaeger1.3 架构模式选择graph TB subgraph 同步模式 S1[请求] --> S2[处理] --> S3[响应] S3 -->|延迟高| S4[用户等待] end subgraph 异步模式 A1[请求] --> A2[入队] A2 --> A3[立即返回任务ID] A4[Worker处理] --> A5[结果存储] A6[轮询/回调获取结果] end subgraph 流式模式 T1[请求] --> T2[流式处理] T2 --> T3[持续返回] T3 --> T4[用户实时看到] end style T4 fill:#4ecdc4选择建议：同步模式：简单请求，延迟要求不高异步模式：复杂任务，可以接受等待流式模式：对话场景，提升用户体验二、性能优化2.1 延迟优化import asyncio import time from typing import List from openai import AsyncOpenAI class LatencyOptimizer: """延迟优化器""" def __init__(self): self.client = AsyncOpenAI() async def parallel_calls(self, prompts: List[str]) -> List[str]: """并行调用多个 LLM 请求""" tasks = [ self.client.chat.compl…

LLM 评估：如何知道模型有多强？
type: item
date: 2025-07-05T02:17:00+00:00
description: 前言：为什么评估这么重要？你训练/选择了一个大模型，但怎么知道它好不好？训练时：Loss 下降了，但模型真的变强了吗？选型时：市面上几十个模型，选哪个？部署后：用户反馈"不好用"，哪里不好？评估的目的：比较不同模型的能力发现模型的强项和弱点指导模型改进方向为下游应用提供参考graph TB subgraph 模型选型 Q[哪个模型好?] --> E[评估] E --> A[GPT-4: 90分] E --> B[Claude 3: 88分] E --> C[LLaMA: 75分] end subgraph 模型改进 M[新模型] --> E2[评估] E2 --> R[发现弱点] R --> I[针对性改进] I --> M end一、评估的维度1.1 评估能力全景mindmap root((LLM 评估维度)) 知识能力 常识推理 专业知识 多语言 推理能力 数学推理 逻辑推理 代码能力 语言能力 阅读理解 文本生成 翻译 对话能力 多轮对话 指令遵循 角色扮演 安全性 有害输出 偏见 幻觉 效率 推理速度 成本1.2 主要评估类型评估类型说明代表数据集知识问答测试事实性知识TriviaQA, NaturalQuestions推理能力测试逻辑推理GSM8K, MATH, ARC代码能力测试编程能力HumanEval, MBPP语言理解测试阅读理解RACE, SQuAD, MMLU对话能力测试对话质量MT-Bench, AlpacaEval安全性测试有害输出TruthfulQA, RealToxicity多语言测试多语言能力XNLI, MGSM二、经典评估基准2.1 MMLU：综合知识测试MMLU（Massive Multitask Language Understanding）：覆盖 57 个学科的选择题。# MMLU 示例 example = { "question": "What is the capital of France?", "choices": ["London", "Berlin", "Paris", "Madrid"], "answer": "C", # Paris "subject": "geography" } # 评估方式：准确率 # 计算模型选择正确答案的比例学科覆盖：STEM：数学、物理、计算机科学...人文：历史、哲学、法律...社科：心理学、经济学、社会学...其他：医学、商业、职业资格...from datasets import load_dataset def evaluate_mmlu(model, tokenizer, subjects=None): """评估 MMLU""" dataset = load_dataset("cais/mmlu", "all") if subjects: # 只评估部分学科 dataset = dataset.filter(lambda x: x['subject'] in subjects) correct = 0 total = 0 for example in dataset['test']: question = example['question'] choices = example['choices'] answer = example['answer'] # 构造 prompt prompt = f"""Question: {question} A. {choices[0]} B. {choices[1]} C. {choices[2]} D. {choices[3]} Answer:""" # 获取模型预测 prediction = get_model_answer(model, tokenizer, prompt) if prediction == answer: correct += 1 total += 1 accuracy = correct / total return accuracy def get_model_answer(model, tokenizer, prompt): """获取模型的选择""" inputs = tokenizer(prompt, return_tensors="pt") # 获取 A/B/C/D 的 logits with torch.no_grad(): outputs = model(**inputs) logits = outputs.logits[0, -1] # 比较四个选项的概率 choices_ids = [tokenizer.encode(c)[0] for c in ['A', 'B', 'C', 'D']] choices_logits = logits[choice…