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

大模型做导师之方案版本比较

背景: 在阅读lightRAG项目时,利用LLM辅助进行理解,当询问LLM如何自定义一个符合项目要求的大模型调用函数时,LLM给出了两个不同的版本。借此想提升一下自己的编程质量,于是让LLM对两个版本进行点评比较。


实现建议
基础版本:

from typing import Optional, List
import aiohttp

async def simple_llm_func(
    prompt: str,
    system_prompt: Optional[str] = None,
    history_messages: List[dict] = [],
    keyword_extraction: bool = False,
    **kwargs
) -> str:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "你的API地址",
            json={
                "prompt": prompt,
                "system_prompt": system_prompt,
                "history": history_messages,
                "is_keyword_extraction": keyword_extraction
            },
            headers={"Authorization": "你的API密钥"}
        ) as response:
            result = await response.json()
            return result["text"]

进阶版本:

from dataclasses import dataclass
from typing import Optional, List
import aiohttp
import asyncio
from tenacity import retry, stop_after_attempt, wait_exponential

@dataclass
class LLMConfig:
    api_key: str
    api_base: str
    model: str
    max_retries: int = 3
    timeout: int = 30

class CustomLLM:
    def __init__(self, config: LLMConfig):
        self.config = config
        self._session = None
        
    async def __aenter__(self):
        self._session = aiohttp.ClientSession()
        return self
        
    async def __aexit__(self, exc_type, exc_val, exc_tb):
        if self._session:
            await self._session.close()
            
    @retry(
        stop=stop_after_attempt(3),
        wait=wait_exponential(multiplier=1, min=4, max=10)
    )
    async def __call__(
        self,
        prompt: str,
        system_prompt: Optional[str] = None,
        history_messages: List[dict] = [],
        keyword_extraction: bool = False,
        **kwargs
    ) -> str:
        # 实现 API 调用逻辑
        pass

# 使用方式
llm_config = LLMConfig(
    api_key="你的API密钥",
    api_base="API地址",
    model="模型名称"
)
llm = CustomLLM(llm_config))

你想了解哪个具体部分的实现细节?


请解释你给出的进阶和基础相比的优势在哪里?

让我详细解释进阶版本相比基础版本的主要优势:
1. 会话管理优化
基础版本:

async def simple_llm_func(prompt: str, **kwargs) -> str:
    async with aiohttp.ClientSession() as session:  # 每次调用都创建新会话
        async with session.post(...) as response:
            return (await response.json())["text"]

进阶版本:

class CustomLLM:
    def __init__(self, config: LLMConfig):
        self._session = None
    
    async def __aenter__(self):
        self._session = aiohttp.ClientSession()  # 复用会话
        return self
        
    async def __aexit__(self, exc_type, exc_val, exc_tb):
        if self._session:
            await self._session.close()

优势:
避免频繁创建/销毁 HTTP 会话
支持连接池复用
更好的性能和资源管理
2. 配置管理
基础版本:

async def simple_llm_func(
    prompt: str,
    system_prompt: Optional[str] = None,
    **kwargs
) -> str:
    # 配置直接硬编码或通过参数传递
    headers = {"Authorization": "你的API密钥"}

进阶版本:

@dataclass
class LLMConfig:
    api_key: str
    api_base: str
    model: str
    max_retries: int = 3
    timeout: int = 30

class CustomLLM:
    def __init__(self, config: LLMConfig):
        self.config = config

优势:
配置集中管理
类型安全
更容易修改和维护
支持不同环境配置
3. 错误处理和重试机制
基础版本:

async def simple_llm_func(prompt: str, **kwargs) -> str:
    async with aiohttp.ClientSession() as session:
        async with session.post(...) as response:
            # 简单的错误处理
            if response.status != 200:
                raise Exception("API调用失败")

进阶版本:

from tenacity import retry, stop_after_attempt, wait_exponential

class CustomLLM:
    @retry(
        stop=stop_after_attempt(3),
        wait=wait_exponential(multiplier=1, min=4, max=10)
    )
    async def __call__(self, prompt: str, **kwargs) -> str:
        try:
            # 实现调用逻辑
            pass
        except aiohttp.ClientError as e:
            logger.error(f"网络错误: {e}")
            raise
        except Exception as e:
            logger.error(f"未知错误: {e}")
            raise

优势:
自动重试机制
指数退避策略
更完善的错误处理
详细的日志记录
4. 扩展性
基础版本:

async def simple_llm_func(prompt: str, **kwargs) -> str:
    # 功能都在一个函数里,难以扩展
    pass

进阶版本:

class CustomLLM:
    async def preprocess(self, prompt: str) -> str:
        # 预处理逻辑
        return prompt
        
    async def postprocess(self, response: dict) -> str:
        # 后处理逻辑
        return response["text"]
        
    async def __call__(self, prompt: str, **kwargs) -> str:
        prompt = await self.preprocess(prompt)
        response = await self._make_request(prompt)
        return await self.postprocess(response)

优势:
模块化设计
易于添加新功能
支持前处理和后处理
更好的代码组织
5. 性能监控
进阶版本可以添加性能监控:

from time import time
from dataclasses import dataclass

@dataclass
class APIMetrics:
    total_calls: int = 0
    total_tokens: int = 0
    total_time: float = 0.0

class CustomLLM:
    def __init__(self, config: LLMConfig):
        self.metrics = APIMetrics()
        
    async def __call__(self, prompt: str, **kwargs) -> str:
        start_time = time()
        try:
            result = await self._make_request(prompt)
            return result
        finally:
            self.metrics.total_calls += 1
            self.metrics.total_time += time() - start_time

优势:
调用统计
性能分析
成本追踪
问题诊断
6. 实际使用示例

# 配置初始化
config = LLMConfig(
    api_key="your_api_key",
    api_base="https://api.example.com",
    model="gpt-4",
    max_retries=3,
    timeout=30
)

# 创建 LLM 实例
async with CustomLLM(config) as llm:
    try:
        # 单次调用
        response = await llm(
            prompt="你的问题",
            system_prompt="系统提示",
            temperature=0.7
        )
        
        # 批量调用
        tasks = [
            llm(prompt) 
            for prompt in prompts
        ]
        responses = await asyncio.gather(*tasks)
        
        # 查看指标
        print(f"总调用次数: {llm.metrics.total_calls}")
        print(f"平均响应时间: {llm.metrics.total_time/llm.metrics.total_calls:.2f}s")
        
    except Exception as e:
        logger.error(f"LLM调用失败: {e}")

这种设计更适合:
生产环境部署
大规模调用
需要监控和分析
需要高可靠性
团队协作开发


http://www.kler.cn/a/536998.html

相关文章:

  • 【leetcode100】岛屿的最大面积
  • PostgreSQL-字符串函数
  • docker 安装 mindoc
  • android 适配 api 35(android 15) 遇到的问题
  • 【Vue】在Vue3中使用Echarts的示例 两种方法
  • 数据结构:顺序表
  • Unity Shader Graph 2D - 使用DeepSeek协助绘制一个爱心
  • Spring Boot启动内嵌tocmat原理
  • mysql的原理及经验
  • Vue3+codemirror6实现公式(规则)编辑器
  • 记录一次mysql主从
  • 【远程控制】安装虚拟显示器
  • 快速上手——.net封装使用DeekSeek-V3 模型
  • openCV函数使用(一)
  • JMeter通过BeanShell写入CSV文件中的中文乱码
  • MoviePy,利用Python自动剪辑tiktok视频
  • 【Unity 墓地和自然环境场景资产包】PBR Graveyard and Nature Set 2.0 高质量的墓地3D 模型,丰富的自然环境元素,轻松构建具有沉浸感和氛围感的游戏世界
  • 三级等保、二级等保谁更高级 ?等保都有哪些?
  • Gateway路由匹配规则详解
  • k8s网络插件及基础命令
  • LINUX——内核驱动程序
  • Python+requests实现接口自动化测试
  • 阿里云不同账号vpc对等连接
  • 文件上传全详解
  • 当春晚遇上AI,传统与科技的奇妙碰撞
  • 使用 Axios 进行高效的数据交互