跳转到主要内容

标签(标签)

资源精选(342) Go开发(108) Go语言(103) Go(99) angular(82) LLM(78) 大语言模型(63) 人工智能(53) 前端开发(50) LangChain(43) golang(43) 机器学习(39) Go工程师(38) Go程序员(38) Go开发者(36) React(33) Go基础(29) Python(24) Vue(22) Web开发(20) Web技术(19) 精选资源(19) 深度学习(19) Java(18) ChatGTP(17) Cookie(16) android(16) 前端框架(13) JavaScript(13) Next.js(12) 安卓(11) 聊天机器人(10) typescript(10) 资料精选(10) NLP(10) 第三方Cookie(9) Redwoodjs(9) ChatGPT(9) LLMOps(9) Go语言中级开发(9) 自然语言处理(9) PostgreSQL(9) 区块链(9) mlops(9) 安全(9) 全栈开发(8) OpenAI(8) Linux(8) AI(8) GraphQL(8) iOS(8) 软件架构(7) RAG(7) Go语言高级开发(7) AWS(7) C++(7) 数据科学(7) whisper(6) Prisma(6) 隐私保护(6) JSON(6) DevOps(6) 数据可视化(6) wasm(6) 计算机视觉(6) 算法(6) Rust(6) 微服务(6) 隐私沙盒(5) FedCM(5) 智能体(5) 语音识别(5) Angular开发(5) 快速应用开发(5) 提示工程(5) Agent(5) LLaMA(5) 低代码开发(5) Go测试(5) gorm(5) REST API(5) kafka(5) 推荐系统(5) WebAssembly(5) GameDev(5) CMS(5) CSS(5) machine-learning(5) 机器人(5) 游戏开发(5) Blockchain(5) Web安全(5) Kotlin(5) 低代码平台(5) 机器学习资源(5) Go资源(5) Nodejs(5) PHP(5) Swift(5) devin(4) Blitz(4) javascript框架(4) Redwood(4) GDPR(4) 生成式人工智能(4) Angular16(4) Alpaca(4) 编程语言(4) SAML(4) JWT(4) JSON处理(4) Go并发(4) 移动开发(4) 移动应用(4) security(4) 隐私(4) spring-boot(4) 物联网(4) nextjs(4) 网络安全(4) API(4) Ruby(4) 信息安全(4) flutter(4) RAG架构(3) 专家智能体(3) Chrome(3) CHIPS(3) 3PC(3) SSE(3) 人工智能软件工程师(3) LLM Agent(3) Remix(3) Ubuntu(3) GPT4All(3) 软件开发(3) 问答系统(3) 开发工具(3) 最佳实践(3) RxJS(3) SSR(3) Node.js(3) Dolly(3) 移动应用开发(3) 低代码(3) IAM(3) Web框架(3) CORS(3) 基准测试(3) Go语言数据库开发(3) Oauth2(3) 并发(3) 主题(3) Theme(3) earth(3) nginx(3) 软件工程(3) azure(3) keycloak(3) 生产力工具(3) gpt3(3) 工作流(3) C(3) jupyter(3) 认证(3) prometheus(3) GAN(3) Spring(3) 逆向工程(3) 应用安全(3) Docker(3) Django(3) R(3) .NET(3) 大数据(3) Hacking(3) 渗透测试(3) C++资源(3) Mac(3) 微信小程序(3) Python资源(3) JHipster(3) 语言模型(2) 可穿戴设备(2) JDK(2) SQL(2) Apache(2) Hashicorp Vault(2) Spring Cloud Vault(2) Go语言Web开发(2) Go测试工程师(2) WebSocket(2) 容器化(2) AES(2) 加密(2) 输入验证(2) ORM(2) Fiber(2) Postgres(2) Gorilla Mux(2) Go数据库开发(2) 模块(2) 泛型(2) 指针(2) HTTP(2) PostgreSQL开发(2) Vault(2) K8s(2) Spring boot(2) R语言(2) 深度学习资源(2) 半监督学习(2) semi-supervised-learning(2) architecture(2) 普罗米修斯(2) 嵌入模型(2) productivity(2) 编码(2) Qt(2) 前端(2) Rust语言(2) NeRF(2) 神经辐射场(2) 元宇宙(2) CPP(2) 数据分析(2) spark(2) 流处理(2) Ionic(2) 人体姿势估计(2) human-pose-estimation(2) 视频处理(2) deep-learning(2) kotlin语言(2) kotlin开发(2) burp(2) Chatbot(2) npm(2) quantum(2) OCR(2) 游戏(2) game(2) 内容管理系统(2) MySQL(2) python-books(2) pentest(2) opengl(2) IDE(2) 漏洞赏金(2) Web(2) 知识图谱(2) PyTorch(2) 数据库(2) reverse-engineering(2) 数据工程(2) swift开发(2) rest(2) robotics(2) ios-animation(2) 知识蒸馏(2) 安卓开发(2) nestjs(2) solidity(2) 爬虫(2) 面试(2) 容器(2) C++精选(2) 人工智能资源(2) Machine Learning(2) 备忘单(2) 编程书籍(2) angular资源(2) 速查表(2) cheatsheets(2) SecOps(2) mlops资源(2) R资源(2) DDD(2) 架构设计模式(2) 量化(2) Hacking资源(2) 强化学习(2) flask(2) 设计(2) 性能(2) Sysadmin(2) 系统管理员(2) Java资源(2) 机器学习精选(2) android资源(2) android-UI(2) Mac资源(2) iOS资源(2) Vue资源(2) flutter资源(2) JavaScript精选(2) JavaScript资源(2) Rust开发(2) deeplearning(2) RAD(2)

category

TL;DR:我们宣布对我们的回调系统进行改进,该系统支持日志记录、跟踪、流输出和一些很棒的第三方集成。这将更好地支持具有独立回调的并发运行,跟踪深度嵌套的LangChain组件树,以及范围为单个请求的回调处理程序(这对于在服务器上部署LangChain非常有用)。

上下文

最初,我们在LangChain中设计了回调机制,用于非异步Python应用程序。现在,我们既支持异步Python的使用,也支持JavaScript/TypeScript中的LangChain,我们需要一些更好的本地抽象,在这个新世界中,许多并发LangChain运行可以在同一线程或多个线程中进行。此外,很明显,在web环境中使用LangChain的开发人员通常希望将回调范围定为单个请求(例如,这样他们就可以将特定的句柄传递给websocket)。

变化

为了解决这些问题,我们对回调机制进行了一些更改:

  • 现在,您可以在构造函数参数(应用于所有运行)中声明您想要的回调,或者将它们直接传递给启动运行的run/call/apply方法。构造函数回调将用于对该对象进行的所有调用,并且仅限于该对象,即,如果将处理程序传递给LLMChain构造函数,则连接到该链的模型将不会使用该处理程序。
  • 请求回调将仅用于该特定请求,以及它包含的所有子请求(例如,对LLMChain的调用会触发对Model的调用,Model使用在call()方法中传递的相同处理程序)。这些都是明确传递的。一个更具体的例子是:当处理程序通过运行传递给AgentExecutor时,它将用于与代理相关的所有回调以及代理执行中涉及的所有对象,在本例中是Tools、LLMChain和LLM。以前,要使用作用域为特定代理运行的回调,该回调管理器必须附加到所有嵌套对象上——这既乏味又丑陋,而且很难重用对象。请参阅下面的TypeScript示例:
// What had to be done before for run-scoped custom callbacks. Very tedious!
const executors = [];
for (let i = 0; i < 3; i += 1) {
  const callbackManager = new CallbackManager();
  callbackManager.addHandler(new ConsoleCallbackHandler());
  callbackManager.addHandler(new LangChainTracer());

  const model = new OpenAI({ temperature: 0, callbackManager });
  const tools = [new SerpAPI(), new Calculator()];
  for (const tool of tools) {
    tool.callbackManager = callbackManager;
  }
  const executor = await initializeAgentExecutor(
    tools,
    model,
    "zero-shot-react-description",
    true,
    callbackManager
  );
  executor.agent.llmChain.callbackManager = callbackManager;
  executors.push(executor);
}

const results = await Promise.all(
  executors.map((executor) => executor.call({ input }))
);
for (const result of results) {
  console.log(`Got output ${result.output}`);
}

 

  • _Chains/LLM/Chat Models/Agents/Tools上的call、_generate、_run和等效异步方法现在接收到第二个名为runManager的参数,该参数绑定到该运行,并包含该对象可以使用的日志记录方法(即handleLLMNewToken)。例如,这在构建自定义链时很有用,您可以在此处找到更多信息。
  • verbose参数现在只是作为在JS中添加ConsoleCallbackHandler和在python中添加StdOutCallbackHandler的快捷方式,后者将事件打印到stdout。它不控制其他回调。

现在,跟踪和其他回调只适用于并发。我们还添加了一个上下文管理器,使跟踪特定的运行更加容易。

中断性更改和弃用:

  • 任何依赖LangChain之外的全局回调或全局跟踪器(即SharedCallbackManager、SharedTracer)的代码都会在python包的0.0.153版本中中断。
  • 现在不赞成将回调管理器附加到对象,请使用回调参数传入处理程序列表。
  • verbose标志现在只控制stdout和控制台回调,而不控制其他回调。

灵感

当我们对回调进行这些改进时,我们研究了一些最终影响最终API的现有解决方案,值得一提:

  • Python日志记录模块(以及其他模块),它提供了一个getChild方法,该方法返回绑定到特定上下文的新记录器。这启发了新的runManager.getChild(),您可以在实现自定义链时使用它来确保正确跟踪子运行。
  • 像express这样的Web服务器框架,每个HTTP请求特定的所有上下文都作为函数参数显式传递,而不是作为某种全局变量提供。

我们还考虑了使用某种形式的异步上下文变量的替代方案,该变量的实现存在于Python和Node.js中(但不存在于其他js环境中)。最后,我们决定采用显式函数参数方法,因为它更容易调试,并且更兼容跨平台(函数参数几乎在任何地方都可以工作)。

如果您遇到任何问题,请告诉我们,因为这是一个巨大的变化!

 

文章链接