← 返回首页
🧠

LLM最佳实践

📂 llm ⏱ 3 min 402 words

--- title: "LLM最佳实践" description: "掌握大语言模型应用开发的核心最佳实践,提升模型性能和用户体验" tags: ["LLM", "最佳实践", "提示工程", "应用开发"] category: "llm" icon: "🧠"

LLM最佳实践

概述

大语言模型(LLM)的应用开发需要遵循一系列最佳实践,以确保模型性能最优、响应质量最高、用户体验最佳。本文将介绍在实际项目中经过验证的核心实践方法。

提示工程最佳实践

1. 明确的指令

清晰、具体的指令是获得高质量输出的基础。避免模糊的描述,提供明确的任务要求。

# 不好的示例
prompt = "帮我写一段文字"

# 好的示例
prompt = """请为电商平台撰写一段产品描述,要求:
1. 字数控制在100-150字
2. 突出产品的三个核心卖点
3. 使用轻松活泼的语言风格
4. 包含一个行动号召(CTA)
产品信息:智能手表,支持心率监测、GPS定位、7天续航"""

2. 结构化输出

使用JSON、Markdown等格式化输出,便于程序解析和处理。

import json

system_prompt = """你是一个数据分析助手。请以JSON格式返回分析结果:

{
    "summary": "一句话总结",
    "key_findings": ["发现1", "发现2", "发现3"],
    "confidence_score": 0.85,
    "recommendations": ["建议1", "建议2"]
}"""

response = openai.ChatCompletion.create(
    model="gpt-4",
    messages=[
        {"role": "system", "content": system_prompt},
        {"role": "user", "content": user_query}
    ],
    response_format={"type": "json_object"}
)

3. 分步骤推理

对于复杂任务,引导模型进行分步骤思考,可以显著提升输出质量。

reasoning_prompt = """请按以下步骤分析这个问题:

步骤1:理解问题核心
步骤2:收集相关背景信息
步骤3:分析可能的解决方案
步骤4:评估每个方案的优缺点
步骤5:给出最终建议和理由

问题:如何优化电商平台的搜索功能?"""

API调用最佳实践

1. 错误处理与重试

实现健壮的错误处理机制,确保服务稳定性。

import time
from openai import OpenAI, APIError, RateLimitError

def call_llm_with_retry(prompt, max_retries=3, base_delay=1):
    client = OpenAI()
    
    for attempt in range(max_retries):
        try:
            response = client.chat.completions.create(
                model="gpt-4",
                messages=[{"role": "user", "content": prompt}]
            )
            return response.choices[0].message.content
            
        except RateLimitError:
            delay = base_delay * (2 ** attempt)
            print(f"速率限制,{delay}秒后重试...")
            time.sleep(delay)
            
        except APIError as e:
            print(f"API错误: {e}")
            if attempt < max_retries - 1:
                time.sleep(1)
            else:
                raise
    
    return None

2. Token优化

合理控制输入输出的token数量,降低成本并提高响应速度。

import tiktoken

def count_tokens(text, model="gpt-4"):
    encoding = tiktoken.encoding_for_model(model)
    return len(encoding.encode(text))

def truncate_to_limit(text, max_tokens=3000):
    tokens = tiktoken.encoding_for_model("gpt-4").encode(text)
    if len(tokens) > max_tokens:
        tokens = tokens[:max_tokens]
        text = tiktoken.encoding_for_model("gpt-4").decode(tokens)
    return text

3. 流式响应

使用流式响应改善用户体验,特别是在生成较长内容时。

from openai import OpenAI

def stream_response(prompt):
    client = OpenAI()
    stream = client.chat.completions.create(
        model="gpt-4",
        messages=[{"role": "user", "content": prompt}],
        stream=True
    )
    
    full_response = []
    for chunk in stream:
        if chunk.choices[0].delta.content:
            content = chunk.choices[0].delta.content
            print(content, end="", flush=True)
            full_response.append(content)
    
    return "".join(full_response)

安全与合规

1. 输入验证

对用户输入进行严格验证,防止提示注入攻击。

def sanitize_input(user_input):
    # 移除潜在的提示注入模式
    dangerous_patterns = [
        "忽略之前的指令",
        "ignore previous instructions",
        "你现在是一个",
        "system prompt"
    ]
    
    sanitized = user_input
    for pattern in dangerous_patterns:
        if pattern.lower() in sanitized.lower():
            return None, "输入包含不允许的内容"
    
    return sanitized, None

# 使用示例
user_input = "请帮我写一篇文章"
safe_input, error = sanitize_input(user_input)
if error:
    print(f"输入验证失败: {error}")

2. 输出过滤

对模型输出进行后处理,确保内容符合规范。

def filter_output(response, banned_words=None):
    if banned_words is None:
        banned_words = ["暴力", "色情", "政治敏感"]
    
    for word in banned_words:
        if word in response:
            return "抱歉,我无法生成包含此类内容的回答。"
    
    return response

性能优化

1. 缓存机制

实现语义缓存,减少重复API调用。

import hashlib
import json
from datetime import datetime, timedelta

class SemanticCache:
    def __init__(self, ttl_hours=24):
        self.cache = {}
        self.ttl = timedelta(hours=ttl_hours)
    
    def _get_key(self, prompt):
        return hashlib.md5(prompt.encode()).hexdigest()
    
    def get(self, prompt):
        key = self._get_key(prompt)
        if key in self.cache:
            entry = self.cache[key]
            if datetime.now() - entry['timestamp'] < self.ttl:
                return entry['response']
            else:
                del self.cache[key]
        return None
    
    def set(self, prompt, response):
        key = self._get_key(prompt)
        self.cache[key] = {
            'response': response,
            'timestamp': datetime.now()
        }

2. 批量处理

对于非实时场景,使用批量API降低成本。

def batch_process(prompts, batch_size=10):
    results = []
    
    for i in range(0, len(prompts), batch_size):
        batch = prompts[i:i+batch_size]
        batch_results = []
        
        for prompt in batch:
            result = call_llm(prompt)
            batch_results.append(result)
        
        results.extend(batch_results)
        print(f"已完成批次 {i//batch_size + 1}/{(len(prompts)-1)//batch_size + 1}")
    
    return results

总结

遵循这些最佳实践,可以帮助你构建更可靠、高效、安全的LLM应用。关键要点包括:使用清晰的指令、实现健壮的错误处理、优化token使用、确保安全合规,以及利用缓存和批量处理提升性能。持续学习和实践这些原则,将帮助你在LLM应用开发中取得更好的成果。