使用Deepseek扩展技术达人的微博,生成参考代码

这是OpenResty作者的微博:

一个好用的 AI Agent 程序框架需要满足:1. 小巧轻便和高效,2. 方便自动最大化请求并发度, 3. 透明切换不同的 LLM(厂商 API 或本地部署的),4. 透明混用大小不同的模型,5. 透明切换实时请求方式和批处理离线方式,6. 自如重跑单个处理环节,7. 方便对数据流进行回溯排查问题,8. 自如切换流式输出或批量输出模式,9. 透明的分布式请求和错误重试机制。10. 透明的纯内存或基于硬盘的海量数据的存储与计算。11. 透明的本地和远方 LLM prompt 缓存,等等。兼顾高吞吐量、低延迟、低成本、高开发效率和高可调试性。
所以我前面自己从零写了一个 Chunbot AI 框架,不依赖外部服务组件,经过大半年的特性和优化积累之后,现在也只有几千行代码,极为小巧和高效。其自带自动化测试台,轻松驱动上亿 token 量级的庞大的测试集。

输入给Deepseek,要求根据描述实现一个Python Agent框架,最小化依赖,结果:

以下是一个基于描述的轻量级Python Agent框架设计,尽量保持简洁并减少依赖:

import asyncio
import json
import logging
from abc import ABC, abstractmethod
from dataclasses import dataclass
from typing import Any, Dict, List, Optional, Union# 基础数据模型
@dataclass
class LLMRequest:prompt: strmodel: strparams: dict = Nonecontext: dict = None@dataclass
class LLMResponse:content: strmodel: strmetadata: dict = None@dataclass
class ProcessingStep:name: strinput_data: Anyoutput_data: Anycontext: dict# 核心框架组件
class AgentCore:def __init__(self):self.model_providers = {}self.pipeline = []self.storage_backend = MemoryStorage()self.cache = PromptCache()self.executor = AsyncExecutor()self.error_handler = RetryHandler()self.current_context = {}def register_model(self, name: str, provider: 'ModelProvider'):self.model_providers[name] = providerdef add_pipeline_step(self, step: callable):self.pipeline.append(step)async def process(self, request: LLMRequest) -> LLMResponse:self.current_context = request.context or {}result = Nonefor step in self.pipeline:result = await self._execute_step(step, request, result)self._record_step(step.__name__, request, result)return LLMResponse(content=result, model=request.model)async def _execute_step(self, step, request, prev_result):return await self.error_handler.execute_with_retry(step, request, prev_result, self.current_context)def _record_step(self, step_name, request, result):self.storage_backend.store(ProcessingStep(name=step_name,input_data=request,output_data=result,context=self.current_context.copy()))# 抽象模型接口
class ModelProvider(ABC):@abstractmethodasync def generate(self, prompt: str, **kwargs) -> str:passclass OpenAIProvider(ModelProvider):def __init__(self, api_key: str):self.api_key = api_keyasync def generate(self, prompt: str, **kwargs) -> str:# 实现实际的API调用逻辑passclass LocalModelProvider(ModelProvider):async def generate(self, prompt: str, **kwargs) -> str:# 实现本地模型推理逻辑pass# 执行与并发控制
class AsyncExecutor:async def execute(self, tasks: List[callable], max_concurrency: int = 10):semaphore = asyncio.Semaphore(max_concurrency)async def wrapper(task):async with semaphore:return await taskreturn await asyncio.gather(*[wrapper(t) for t in tasks])# 存储抽象层
class StorageBackend(ABC):@abstractmethoddef store(self, data: Any):passclass MemoryStorage(StorageBackend):def __init__(self):self.data = []def store(self, data: Any):self.data.append(data)class DiskStorage(StorageBackend):def store(self, data: Any):# 实现磁盘存储逻辑pass# 错误处理与重试
class RetryHandler:async def execute_with_retry(self, func: callable, *args, max_retries=3, **kwargs):for attempt in range(max_retries):try:return await func(*args, **kwargs)except Exception as e:if attempt == max_retries - 1:raiseawait asyncio.sleep(2 ** attempt)# 缓存系统
class PromptCache:def __init__(self):self.cache = {}def get(self, prompt: str, model: str) -> Optional[str]:return self.cache.get((model, prompt))def set(self, prompt: str, model: str, response: str):self.cache[(model, prompt)] = response# 测试工具
class TestBench:def __init__(self, agent: AgentCore):self.agent = agentasync def run_test(self, test_cases: List[LLMRequest]):return await self.agent.executor.execute([self.agent.process(case) for case in test_cases])# 使用示例
async def main():agent = AgentCore()agent.register_model("gpt-4", OpenAIProvider("sk-..."))agent.register_model("local", LocalModelProvider())@agent.add_pipeline_stepasync def preprocess(request, prev):return request.prompt.upper()@agent.add_pipeline_stepasync def inference(request, prev):return await agent.model_providers[request.model].generate(prev)response = await agent.process(LLMRequest(prompt="Hello world",model="gpt-4"))print(response.content)if __name__ == "__main__":asyncio.run(main())

这个框架设计具有以下特点:

  1. 模块化设计:通过清晰的抽象层分离不同功能模块
  2. 异步优先:基于asyncio实现高效并发控制
  3. 透明的模型切换:统一的ModelProvider接口支持任意LLM
  4. 全链路追踪:自动记录每个处理步骤的输入输出和上下文
  5. 弹性存储:可扩展的存储后端支持内存/磁盘存储
  6. 灵活扩展:通过装饰器轻松添加处理步骤
  7. 内置重试:自动化的错误重试机制
  8. 轻量级:零外部依赖,仅使用标准库
  9. 透明缓存:简单的Prompt缓存系统
  10. 测试支持:集成测试基准工具

可以通过组合不同的组件和管道步骤来实现复杂的处理流程,同时保持代码简洁和可维护性。执行模式(实时/批量)、输出方式(流式/批量)等可以通过配置执行器参数来实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/879148.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nexttrace :一款开源可视化的路由追踪工具

一、文章来源 今天要给大家推荐一个 GitHub 开源项目 sjlleo/nexttrace,该项目在 GitHub 有超过 700 Star,用一句话介绍该项目就是:“An open source visual route tracking CLI tool”,一款开源可视化的路由追踪工具。 https://www.ajmwz.com/15965.html二、工具介绍 next…

scroll-view标签滚动条

在nuiapp里做滑动tab时用scroll-view标签会出现滚动条情况,以下为搜索结果:但是只有第四个有效: 在微信小程序中,<scroll-view> 组件的 scrollbar-width 属性确实可以用来隐藏滚动条,但有时可能会因为平台或版本差异导致该属性无效。如果 scrollbar-width="0&q…

vue3 model.ts render中的按钮被点击时将事件传递到vue页面

背景:列表中的字段配置放在model.ts中,models.ts中某个字段可以点击,当点击发生时需要将点击事件传递到vue页面,页面再做出相应处理。 我的model.ts配置的表格列: 再点击button时,该点击事件仅在model.ts内可用,无法传递到外部,所以使用vue的依赖注入方法,代码也比较简…

DeepSeek的崛起:未来5年内,项目管理市场的10大投资机会

一、AI 驱动的智能项目管理平台(一)核心技术与优势随着 DeepSeek 推动 AI 技术的不断突破,智能项目管理平台成为极具潜力的投资方向。这类平台深度融合自然语言处理(NLP)、机器学习(ML)、深度学习(DL)等 AI 技术,实现项目管理全流程的智能化革新。自然语言处理技术让…

db_recovery_file_dest_size满了处理(ORA-19815)附带清理alert日志和trace日志

背景 oracle上生产后常见问题 错误截图ORA-19809: ▒▒▒▒▒˻ָ▒▒ļ▒▒▒▒▒▒▒▒ ORA-19804: ▒޷▒▒▒▒▒ 926934528 ▒ֽڴ▒▒̿ռ▒ (▒▒ 15955132416 ▒ֽ▒▒▒▒▒▒▒) 2025-02-05T14:24:35.312123+08:00 ARC0: Error 19809 Creating archive log file to /…

DC-DC电路如何应用前馈电容?(非原创)

电源是现代电子产品必不可缺的模块,现今大多数的通用电源芯片都会提供如下图所示的反馈引脚,便于客户使用反馈电阻实现所需的输出,简化设计并节省调试时间。但是通用化也从根本上制约了转换器的带宽及瞬态响应能力。这种情况下,设计师可以通过使用前馈电容在一定程度上对此…

Deepseek免费无限量API无需本地部署就可用最大70B蒸馏模型

一、DeepSeek概述 2025年1月20日,DeepSeek正式发布 DeepSeek-R1 模型,并同步开源模型权重。DeepSeek-R1在后训练阶段大规模使用了强化学习技术,在仅有极少标注数据的情况下,极大提升了模型推理能力。 DeepSeek-V3和DeepSeek-R1两款大模型,成本价格低廉,性能与OpenAI相当,…

17C++循环结构-(do-while循环)2

1、模拟法; 2、纯小数转化为最简分数一、实例 1、模拟法1 在一次风之巅小学文艺汇演中,狐狸老师、尼克、格莱尔同台演出,其中个环节是拍手游戏,狐狸老师每1秒拍一次手,尼克每2秒拍次,格莱尔每4秒拍一次。三人同时开始拍第一次手,每人都拍10次。 试编一程序,算一算观众可听…

智能编码在前端研发的创新应用

今天主要想分享一些关于大模型如何协助我们进行前端编码的实践。首先,让我们以一个前端开发的实例开始。通常,当需要实现一个新的前端功能时,我们会收到相关的背景和需求描述。一、前端开发实例 今天主要想分享一些关于大模型如何协助我们进行前端编码的实践。首先,让我们以…

16C++循环结构-(do-while循环)1

1、do-while 语句; 2、各数位之和; 3、纯小数变整数; 4、数学计算一、do-while 语句 问题:每次测试后狐狸老师总会把成绩输入计算机,进行处理分析。但输入时有时会出错,如当满分为100分时,输入小于0或大于100的数,表示输入有误。试编一程序,输入某一位同学成绩时,自动检查…

MyBatis之日志记录

在mybatis的配置文件中加上1 <settings> 2 <setting name="logImpl" value="STDOUT_LOGGING"/> 3 </settings> 这里value的配置还有很多

杭州开盘数据恢复之希捷移动硬盘突发损坏通电咯吱咯吱敲盘异响

这是一块常见的希捷1T移动硬盘,用户描述说是突然读取异常,呈未响应状态,后来就无法识别了,并发出了嘎嘎的异响声。在当地电脑店检测,判断是磁头坏了,但由于异响声比较大,工程师感觉损坏严重,盘片有划伤,没有太大把握,不敢贸然的去开盘恢复,建议去找更专业的数据恢复…