您现在的位置是:首页 >其他 >大模型做导师之方案版本比较网站首页其他

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

gz927cool 2025-03-25 12:01:01
简介大模型做导师之方案版本比较

背景: 在阅读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}")

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

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。