📱

Get Our Mobile App

Take your business learning on the go!

Download on the App StoreGet it on Google Play

Case Study + Deep Dive: Telemedicine Support Agents with LangGraph/MCP - Dan Mason

AI Engineer1:56:13

Transcription

[音乐] 好的。嗯,大家好。非常感谢大家的到来。嗯,非常感谢你们在这里。嗯,这是一个很棒的节目。我喜欢这个节目。嗯,我去年是以参会者的身份来到这里的。嗯,二月份在纽约的纽约峰会上发了言,我真的很高兴能回来。嗯,所以这非常像一个展示和讲解。我在 Slack 频道里说过,所以任何不在 Slack 频道里的人,都可以随意加入。里面有一些链接可能会对你们有帮助。嗯,如果有人需要的话,是 workshop Langraph MCP agents。但从根本上说,我只是想和大家一起回顾一下我的团队在构建医疗用例的代理工作流方面所做的一些非常有趣的工作。嗯,而且,嗯,这非常像我们做的方式。我会详细介绍一下。这不是唯一的做法。嗯,我希望在座的各位可能会看看这个,然后说,“这太蠢了。你们应该做得更好。”然后,你知道,请举手告诉我。嗯,但是,但是它建造起来真的很有趣。我对结果非常满意。而且,嗯,非常激动能向大家展示一下,它到底是什么。嗯,好的。那么,我将进入演示模式。好了。开始了。好的。嗯,首先,关于 Stride,有几件非常快速的事情。嗯,如果有人需要我的 LinkedIn,那就是我,但嗯,还有其他几个地方可以找到它。嗯,我们是一家定制软件咨询公司。嗯,所以这意味着在实践中,无论你需要什么,我们都会为你建造。我们已经做了很多 AI 相关的工作。嗯,这可以归入几个特定的类别。嗯,我们使用大量的 AI 进行代码生成。嗯,我们有几个产品和服务,用于完成诸如单元测试创建和维护之类的事情。我们做了很多关于老旧代码库现代化改造的工作。嗯,你知道,比如,你知道,2000 年初的 .NET 是我们专门从事的领域之一。嗯,但今天我要展示的,是我们围绕代理工作流所做的工作。所以,你知道,关于这种代理工作流的想法,真的只是,你知道,这是可以用传统软件完成的事情,而我今天要展示的这个东西,在它的第一个版本中,是用传统软件完成的。嗯,但我们已经用 LLM 为核心重建了它,使其更灵活,更强大,而且,你知道,最终,只是更酷。嗯,所以,嗯,非常激动能向大家展示更多关于这方面的内容。那么,我将从一点点背景介绍开始。嗯,我将做一个案例研究,嗯,这非常简短,但它会让你对我们试图解决的问题以及我认为我们解决得有多好有一个大致的了解。嗯,然后我们将深入探讨我们想深入了解的所有内容,关于它是如何工作的。嗯,让我先问一下。如果你有问题,请举手。我会尽量注意到并尽量回答你。嗯,有一些麦克风可以传递。嗯,但你最好直接喊出来,然后我会重复一遍,嗯,对着我的麦克风。嗯,而且,从根本上说,我不知道这是否是两个小时的材料。可能就是,但你知道,请,请保持诚实。嗯,我会谈论任何与此相关的事情,你们想谈论的。所以,嗯,这里的客户是 Aila。所以,Aila Science 是一个女性健康机构,它试图帮助治疗早期妊娠丢失,通常也称为流产。嗯,但具体来说,这是一种治疗,发生的情况是,你知道,你经历了事件,最终去了医院或诊所。他们会给你开药,对吧?然后你必须自己服用这些药物,这对于你和你的家人来说是一个非常痛苦的时期,而且你知道,你需要跟踪什么时候应该做什么。这可能非常具有挑战性。嗯,除了这个,还有其他用例,比如化疗,人们很难记住今天是星期几,更不用说他们应该做什么了,对吧?你知道,有各种各样的治疗方法都与此相关。嗯,但 AVA 特别有一个系统,他们用它来帮助人们在家中管理这些远程医疗方案,对吧?而且,嗯,那个系统是基于短信的,所以这里我将展示的一切基本上都是一个基于短信的引擎,加上一些核心业务逻辑,可以帮助人们保持正轨。它可以回答他们的问题。它可以检查他们,你知道,以确保治疗顺利进行。他们仍然与医生有联系。这并不是要取代医生。它只是在很多时候帮助人们在没有医生直接支持的情况下完成治疗。嗯,所以,首先有一些免责声明。首先,我将向你们展示很多客户的实际代码。嗯,非常感谢我的客户。感谢 Aila 如此开放。这真的很棒。我很高兴能向你们展示这么多。嗯,我删掉了一些东西。嗯,我认为剩下的仍然,你知道,非常能体现整个事物的特点以及它的工作原理。嗯,Stride,我们是定制软件的人。所以,我们构建定制软件。我不想隐藏这一点,对吧?使用现成的工具可以完成很多事情。嗯,但这个客户有一些特定的要求,使得很多东西最好是定制的。嗯,所以我们做了,但我们尽了最大努力使用,你知道,大块的现成的东西,对吧?所以,你会看到很多 Langraph,Langchain,Langsmith,你知道,还有很多类似的东西,你知道,非常多,因为我们相信这增加了价值,而且它从根本上使系统更具可解释性。嗯,而且,你知道,在托管方面也有一些限制。你知道,这至少部分地与患者数据以及 HIPAA 和其他隐私要求相交叉。嗯,还有一点,正如我之前提到的,没有正确的方法来做这件事,但这种方法对我们来说是有效的,而且我认为当我们回顾它时,你会看到我们做出的一些选择。嗯,你知道,我们肯定有其他方法可以将这些工具组合起来。我认为我们肯定有其他方法可以完成这个工作流。嗯,但我们喜欢它的结果。它保留了我们知道对客户很重要的一些东西,以及那种保留,你知道,很多人的判断,而不是完全相信这些元素,这是一个非常混合的系统,人类非常地参与其中,而且,正如我之前提到的,我真的很希望你们看看我们在这里所做的事情,然后说这太蠢了,或者你们有没有想过这个问题,因为,你知道,这是一个我们只工作了几个月项目,但你知道,事情已经发生了变化,这就是 AI 的方式。所以,我确信,而且我知道有几件事,你知道,我们可以用更新、更现代的选择来替换我们做出的一些选择。嗯,同时,你知道,可能有一些情况,你知道,我真的没有使用 line graph。我希望有人举手告诉我。所以,请在你们的大脑里留着这一点。很酷。嗯,非常简短地介绍一下我们使用的技术栈以及我们构建的团队。所以,第一件事,再次强调,这里有很多 lang chain。嗯,这不是因为其他框架不能做到这一点。也不是因为我们不能自己构建。我们选择它的首要原因是它很容易向其他人解释系统,对吧?你知道,如果你看看,我将特别展示 Langraph 的内容。它很容易在项目的早期就进入我们的客户那里,然后说,“嘿,这个东西就是这样工作的。你可以看到它从这里到那里。这里有循环。就像这里是我们对过程的评估,这里是人类参与的地方。”这样做非常直接。嗯,而且我认为如果使用一个不那么直观,而且坦率地说,组织得不太好的东西,会更难。所以,所以我们对此很满意,对吧?lang chain 工具确实有一些权衡,但它们大多是我们能够接受的。嗯,在我们这里展示的例子中,我们使用的是 Claude。嗯,但我们编写的核心代码可以与 Gemini、OpenAI 一起使用。嗯,我们认为 Claude 在这方面更好,有几个原因。我会在接下来的过程中详细介绍。嗯,但是,你知道,这里基本上没有模型特定的东西。这几乎都是工具调用和 MCP 以及其他一些在大多数模型之间都相当可移植的东西。嗯,整个技术栈不仅仅是 LM 部分,对吧?所以 LM 部分是 Python 和一个 line graph 容器。嗯,然后另一部分,对吧?文本消息网关和数据库以及仪表板,我将广泛展示,是 Node 和 React 和 MongoDB 和 Twilio,整个东西都托管在 AWS 上。没有一个必须是这样的。这只是我们选择的。嗯,我们选择 AWS 的主要原因是,你知道,这必须支持多个不同的地区。我们必须能够完全在欧洲部署东西,在某些情况下,对吧?所以,我们需要确保我们有一套不错的,你知道,云连接,我们可以与之合作。评估。嗯,我将展示我们构建的评估系统。嗯,我们无法使用,或者至少我不应该说无法使用。我们选择不完全使用 Langmith 的现成东西。这部分是因为我真的不想完全被他们锁定。我希望数据在那里。我希望能够看到,你知道,Langmith 中的当前系统,但我想要一些独立的东西。事实证明,为了使评估从根本上可行,我们不得不做很多预处理。所以,我们构建了一个外部工具,它基本上从 Langmith 中提取数据,进行处理,然后运行 PromptFu。嗯,我们选择 Prompt Fu 的原因之一,如果有人用过它,你知道,他们有一个非常灵活的,他们称之为 LLM 评分标准。而且,你知道,这是一个 LLM 作为裁判。你基本上描述了你希望评估如何工作。你输入数据,然后它会为你提供一个单独的可视化。所以,我们最终对此非常满意。这绝不是唯一的方法。这绝对是,你知道,最适合我们的团队的东西。所以,有,而且仍然有,两名软件工程师,一名设计师,还有我。而且我不会称自己为软件工程师。这就是为什么我没有将自己包含在那个群体中。你可以想象有两名软件工程师在维护核心系统,该系统拥有网关、仪表板和文本消息功能,对吧?以及数据库。嗯,我维护并基本上构建了 Langraph 方面的一切,对吧?所以,想象一下,这是两个通过明确定义的合同相互通信的独立系统。而且,那两名软件工程师大致了解我的代码是如何工作的,但他们实际上并没有维护它。你知道,几乎完全是我和 AI 朋友们一起完成的。嗯,关于这一点,我将展示的一切都是我写的代码,我想说清楚。我很久没有真正当过软件工程师了。我确实有工程背景。我大学毕业后七年都在开发移动应用。我休息了 15 年,去做了产品经理,现在又回来了大约两年。但这意味着,你知道,基本上你看到的东西,或者我将要展示的东西,大部分都是,你知道,我用 Klein 写的代码。这是我个人最喜欢的。嗯,所以这里有很多选择。我最喜欢 Klein。你可以用任何你想要的。代码实际上并不复杂。就像我估计的,我还没有真正数过,但可能有几千行 Python 和几千行提示。它们大约是相等的,对吧?所以我用代码写了 Python,大部分是手动写了提示。不是 100%,对吧?但这就是关于劳动分工的思考方式。嗯,而且,就此而言,任何这些工具都可以很棒。我选择 Klein 的主要原因只是因为,你知道,我们不需要,你知道,那种高度优化的,你知道,每月 20 美元的流量。你知道,我在代币上花了远不止 20 美元。这就是事实。你知道,花钱只是为了在任何给定时间拥有模型最好的可用上下文是值得的。Klein 是做到这一点的好方法。好的。还有一些示例代码。所以我确实提到了,这也在 Slack 频道里。如果你想跟着做任何事情,你可以通过启动你自己的小型 Langraph 容器和 MCP 来完成。你完全可以这样做。但我将展示的一切都是专有的客户代码,所以,我显然不能给你那些链接。所以,如果你愿意,请随时启动它。我们有两个小时,这是一个非常长的时间。如果你有兴趣在最后花一些时间来处理一些实际代码,我非常乐意这样做。所以,请随时做好准备。好的,首先有几件事,只是为了确保我们在术语和我们谈论这些事情的方式上是同步的。所以,嗯,我喜欢 Langchain 对代理的定义。基本上是因为,你知道,你会看到我们在这里所做的是使用 LLM 来控制,控制这个应用程序的流程,对吧?这确实就是这样。而且我喜欢这一点,我不知道 Chris 在不在。他在纽约上一次活动上。我喜欢这是一种证明我们如何尝试构建这个系统以及为什么的方式,对吧?所以,关于生产中的代理的想法,对吧?你必须知道它们在做什么。你必须知道,你知道,它们能做到这一点,而且你必须能够引导,对吧?如果你只有几个这样的东西,你就会得到糟糕的结果,对吧?所以,我只是喜欢这种框架:如果你有能力,但你不知道它在做什么,那很危险。如果你确切地知道它在做什么,但你无法控制它,它就会做奇怪的事情,而你无法帮助。请继续。我们很多人都在找 Slack 频道。哦,我再找一个。它就在这里。workshop langraph MCP agents。明白了。没问题。好的,但是,所以透明度但没有控制是令人沮丧的,而控制但没有能力是无用的。我只是喜欢这种框架。我认为这正是我们试图解决的问题。我们需要一些能够完成工作,清楚地知道自己在做什么,并且能够以非常明显的方式被人为地引导的东西。所以,话虽如此,我将从一个案例研究开始,对吧?这有点奇怪,但希望这能让你对我们试图解决的问题有一个大致的了解。所以,这里的想法是,有一个现有的产品,对吧?所以,有一个产品,基本上是让人类手动按下控制台上的按钮,然后发送一条短信,对吧?所以,你会读到病人说了什么。他们可以说,“我下午 3 点服用了我的药。”他们可以说,“我正在流血,我不知道是怎么回事。我没事吗?”他们可以问其他关于治疗的问题,而一个人必须进入一个软件,然后点击一个按钮,准确地反映出某人在工作流中的位置,对吧?因为,你知道,你可以模拟很多事情,你知道,想象一下,在医疗治疗过程中,所有可能发生的事情都有极其复杂的流程图。所以,AIA 团队已经构建了这个,对吧?但他们意识到,要扩大人类团队的规模以服务更多的病人是极其昂贵的,对吧?他们需要太多人点击太多按钮。他们还意识到,他们无法真正扩大系统以支持新的治疗方法,对吧?这是他们想做的事情。这并不是唯一需要支持的方案。他们还有其他的。嗯,所以,想法是,他们要么会重建遗留软件以使其更灵活,要么他们会基本上重建它以使用一种不同的核心决策方式。而且,当他们这样做的时候,你知道,LLM 开始变得足够强大,能够处理这种工作。嗯,所以我们构建的,我们为他们构建了一个工作流,基本上是一个连接到它的软件,使他们能够灵活地进行新的治疗,对吧?所以,这种定义蓝图和知识库的想法是我们思考这个问题的方式。嗯,而且,基本上是医学批准的语言,对吧?所以,你有人工操作员按按钮而不是发短信的一个原因是因为这是医疗建议,对吧?你知道,你不是,至少不应该提供与批准语言有实质性差异的医疗建议,对吧?有原因,这些东西,你知道,就是这样说的。你知道,医生也有类似的限制。嗯,我们还构建了一个自我评估功能,我马上就会详细介绍。嗯,我们想确保我们能捕捉到复杂的情况,并将其呈现给人类,对吧?因为我们想让人类参与进来,但我们试图提升那些只是操作系统并点击所有按钮的现有人员,让他们来监督代理,对吧?这确实是我们核心的工作模式。我在这里看到了一个问题。是的,你可能已经说了。这些操作员是吗?所以,问题是,这些操作员是否经过医学培训?有一位医师助理,她基本上领导着运营团队。所以,你可以这样想,当出现超出蓝图的情况时,她就会被升级。所以,如果你遇到一种情况,他们只是说,我真的不确定该怎么做,就会有一个 Slack 发送到那个频道,里面有一个医师助理,她会提供医疗建议。所以,你知道,再次,这也是为什么它难以扩展的原因,对吧?因为,你知道,在这个特定的团队中,你只有一个人。当然。嗯,所以,为了稍微超前一点,但希望你很快就能明白为什么,这大致上,再次,我们仍在进行测量,对吧?我们仍在试图弄清楚,你知道,产能已经上升到什么程度。我们认为大约是 10 倍。我们认为他们可以通过这种新方法大约服务 10 倍的人。现在,这并非免费,对吧?我们必须构建软件。我们必须支付代币的费用。代币可能会很贵。但如果你考虑到,你知道,仅仅是扩大一个团队的规模以及构建更灵活的软件以支持更多治疗方法所涉及的规模问题,我们认为这种产能提升是非常非常值得的,也是非常能够解决问题的。而且,你可以在不编写更多代码的情况下进行新的治疗和新的工作流。对吧?这是他们最重要的事情。你会看到我们在这里所做的主要是 Google Docs,对吧?而且,你知道,我们有一些更高级的技术来管理这些东西并随着时间的推移进行版本控制,但我们说的是能够支持全新的治疗和全新的工作流,而无需返回代码,对吧?这对他们来说非常有价值。你提到了速度衡量护理质量。所以,问题是速度是否增加。是否有护理质量的衡量标准?简短的回答是,还早,对吧?我的意思是,这仍然是一个正在进行中的系统。它正在与真人一起使用,但仍然非常非常早期。我认为我们看待它的方式是,操作员将是最终的仲裁者,对吧?他们将能够看到这些对话,并在他们批准它们时,你知道,在他们审查它们时,确定:嘿,它基本上都做对了。然后有一些现有的,你知道,seesat 级别的衡量标准可以应用于治疗的另一端的人。10 倍听起来有点低。是因为操作员现在不批准所有出来的内容吗?所以,他们不批准所有出来的内容,我同意 10 倍只是一个数量级,而不是一个精确的衡量标准,但我想在这种情况下,你会看到几个需要批准的例子,以及原因,但批准也非常快,所以,我的论点是,你可能只看到每 10 次交流中的一次,当你看到它时,它花费的时间和你上次点击按钮的时间差不多,而这正是他们一直在做的事情,所以这就是我们将其作为基准的原因。好了。嗯,让我们开始吧。嗯,所以,这只是 Langraph 中这个东西的样子快照。我马上会向你展示真实的,它实际上自拍这张照片以来已经发生了一点点变化。嗯,但我们真正要谈论的是,嗯,今天操作这个系统的人,我们称他们为运营专员。所以,这个东西实际上是在引入一个虚拟运营专员。该运营专员将评估与患者的对话交互的状态。确定最佳响应,包括你可能发送的文本消息,你可能提出的问题,你可能采取的行动,因为其中一些是关于维护患者的状态,对吧?你知道,你在任何时候都在试图弄清楚,这个人什么时候吃药,他们什么时候吃药,你知道,他们有什么药?他们现在是什么时间,这实际上比你想象的更重要。所有这些都必须由系统维护,对吧?所以,虚拟律师正在做所有这些工作,然后它将传递它的提议,对吧?它基本上会说,我认为我们应该这样做,然后将它传递给评估代理。有一个独立的实时 LLM 作为裁判过程,与评估分开,我们稍后会讲到。但实时 LLM 作为裁判基本上是在说,好的,鉴于刚刚发生的事情。这是我们对 LLM 认为它有多正确的评估。坦率地说,这非常具有挑战性。LLM 很难说服它们错了。但它也在关注复杂性,对吧?所以,即使 LLM 认为它做出了所有正确的决定,你也可以让它公正地说,“好吧,我改变了这个,我改变了那个,我安排了很多消息。这很复杂。也许应该由人来看看,对吧?”所以,这实际上更容易实现。而且,这两者都在调用工具。这些工具是 MCP 的混合体。嗯,所以,这里有两种 MCP。我将向你们展示一种,它基本上只是查看本地文件,这样我就可以向你们展示我环境中的所有东西。但也有通过网络传输到更大的软件系统的 MCP,并将所有这些东西保存在数据库中,对吧?所以,这两种东西混合在一起。嗯,其余的工具是关于维护状态的,因为当对话发生时,LLM 需要知道,你知道,基本上,我做了这个更新和那个更新,这是我正在处理的当前状态,它必须能够实时地操纵这些东西。这不是 MCP。这也不是去数据库。你知道,这完全发生在实时线程中。然后一旦完成,它就会被推出去,基本上被保存起来。好的。嗯,再次,我们会详细介绍。我确实想花一点时间介绍一下系统架构,对吧?所以我意识到它有点小。请继续。当你提到系统状态时,我之前听到 LLM 有一个上下文或某种状态对象。你说你使用工具。你是在谈论不同的东西,还是关于 Langraph 中状态的管理问题?嗯,简短的回答是,这可能是我没有以最佳方式做的事情之一,顺便说一句,但使用 Langraph,有一个状态对象,我们基本上在请求来自 JSON blob 的时候加载它。我们在图运行中保持它的活力。它不能直接被模型访问,至少不是我们这样做的方式。所以,你会看到,当我们进入这个的时候,你可以在 Langsmith 中看到所有传入的状态。我可以看到,嘿,这就是加载的全部内容。我仍然需要再次在我的第一条消息中重复给 Claude,它实际上并没有出现在同一个地方。然后我调用函数,状态会在图运行中演变,当它输出时,就是 Python 代码,而不是模型,它基本上会获取所有这些状态,然后将其序列化并发送出去。所以,你会看到它是如何工作的,但我不知道我是否做对了。还有其他吗?是的。是的。有点相关。你有一个节点,用于那个虚拟的来回工具,对吧?是的。我假设你没有将业务逻辑硬编码到单独的节点中,是因为你会失去下次的工作流。是这个意思吗?是的。所以,问题是为什么基本上虚拟 A 是一个代理,而不是一个预先编码的,你知道,这里是如何管理特定治疗的。是的。我认为我们保持简单是因为我们不想在架构方面过于具体于治疗。但你可以想象做,你知道,一组稍微小一点的,你知道,调优更好的代理,它们,你知道,负责任务的某些元素,这仍然相当通用。我认为它不是最优化的主要原因是缓存。嗯,这是另一个问题,你知道,我认为我做得对,但有很多变化。缓存整个消息流,无论是通过一个代理,还是通过一个代理完成大部分工作,都更容易。我们正在使用 Claude。Claude 有非常明确的缓存机制。而且我认为每次我更改系统提示时,缓存都会失效。所以,从根本上改变代理身份就会这样做。所以,这是我们选择它的一个原因。它当然不是一个硬性规定,永远不变的选择。持续时间是多久?我们说的是几个月,还是多少消息?是的。所以,这个用例,早期妊娠丢失,通常是一种治疗,我认为从头到尾需要大约三天才能完成,然后之后还有一次检查,对吧?所以,想象一下,在一周内,与该患者的整个互动就完成了,除非他们回来并稍后有疑问,对吧?你知道,有一些变体,比如六周后你进行妊娠试验,对吧?这都没关系,消息历史被保存了,但生成每条消息的计算并没有,或者至少不是在我们行为的状态中。所以,你知道,我见过的最复杂的对话大约有 150 条短信。这对于人类来说是很多,需要记在脑子里。对于 LM 来说,这不算太糟糕,对吧?但就是这个级别。好了。嗯,所以,再次,只是为了指出这里的线条在哪里,对吧?所以,正如我刚才跑题了,顶部的框是我们今天将要看的,对吧?它实际上是一个 Python 容器,可以本地访问这些蓝图、知识库,对吧?我们还通过网络在这个蓝色容器中维护一些东西。那里实际上是我将要展示的仪表板。那里是文本消息网关。而且,我认为我们将把很多上下文转移到那里,对吧?蓝图,所有这些东西都应该生活在更持久的软件容器中。现在它生活在,你知道,靠近 Python。好的。嗯,让我们开始吧。嗯,所以,我首先要展示的是,你知道,从高层次上来看,这个软件是什么样的。所以,嗯,这再次是,嗯,控制台,仪表板,对吧?人类运营专员将要查看的东西。而且,我将在这里展示几件事,只是为了给你一个基线,对吧?所以,第一件事是,这需要注意。当前系统基本上一直闪烁着“需要注意”,每次有任何患者发来短信时,这个东西就会亮起,对吧?你知道,所以,有,而且,你知道,有数百名患者,数千名患者随时都在系统中,所以,你知道,这个“需要注意”曾经是多个人必须不断盯着的东西,对吧?只是为了确保他们注意到一切,以便他们在合理的时间内发出消息。现在,“需要注意”实际上,你知道,一次只是一件事,对吧?如果我在这里查看对话,好了。你可以看到,上面的一个实际上需要回复。我稍后会讲到。但任何时候,对吧?这是我的测试环境。你知道,我已经准备好了一些对话。如果我点击这些东西,我可以看到,基本上,我将回到这里,回到整个消息历史的开头,然后我将打开这个理由。你看到的是整个对话。这能看清楚吗?我把它放大一点。这样好点吗?好的。嗯,所以,这里的想法是,代理的名字叫 Ava,对吧?这是人们正在互动的个性。嗯,这些语言都来自这些蓝图,对吧?我将向你们展示。所以,第一条消息只是系统发送的初始消息,基本上是为了启动一切。所以,想象一下,有人手里拿着一包药,他们扫描了一个二维码。他们输入了他们的电话号码,他们收到了这条短信,对吧?然后他们开始交谈。所以,你可以看到病人会说的话,你知道,是自由格式的文本,对吧?你知道,这,我的意思是,他们可以用任何方式说“是”。旧系统实际上有不同的“是”按钮,比如“是,我有药。”“是,我听到了。”我的意思是,有各种各样的变体,对吧?而且,因为你必须根据这些事情的不同而做出不同的回应。我们在这里能够做的是,真正地,你知道,接受这些自由格式的答案,解释它们,然后基本上提供一个理由,说明为什么你在某个时间会说某个话,对吧?所以,这相当于如果你用人类来做这件事,然后你问人类,你为什么这么说?LM 可以提供这种类型的上下文。所以,这是 Claude 在查看这里的历史,我将向你展示 Langmith 中的样子,这会更清楚。然后说,好的,这是我接下来应该说的话。而且我应该说它的信心是 100%。对吧?它通常非常有信心,对吧?但重点是,整个过程在很大程度上是自动进行的,对吧?你通常不需要人类参与,因为这是一件非常直接的事情。他们有药。我需要知道的下一件事,这是这种治疗的一个非常有趣的部分,我需要知道现在是什么时间。这些是短信。我们不知道这些人的任何信息,原因有很多。我们不知道他们多少信息,这有点好,对吧?我们不想处理所有关于提供者保密和患者数据的事情,对吧?所以,如果我们要做这种长期的治疗,我们需要做的一件事就是弄清楚他们现在是什么时间,然后基本上提取这些数据,弄清楚他们当地的时间是什么。对吧?所以,在这种情况下,当我回答这些问题时,我是在东部时间。我告诉它现在是什么时间。它计算出与 UTC 的偏移量,然后说,“好吧,我想你在东部时间,对吧?”然后它在这里设置,然后说,“好了,从现在开始,我知道我的病人是在东部时间,除非他们告诉我其他情况。”他们可以回来告诉你其他情况,对吧?这是旧系统真正没有很好地处理的事情。嗯,但如果病人回来告诉你,“我在飞机上。对我来说其实是七点。”我们只是更新时区,然后继续。对吧?从这个角度来看,这是一个非常灵活的系统。嗯,然后我们在这里看到,然后说,“好的,既然我知道现在是什么时间,我将问他们是否已经开始治疗,对吧?”而且,你知道,有一个蓝图,对吧?我们会讲到,你知道,基本上就是,你知道,他们要服用的药物,以及一种非常特定的服用方式,对吧?方案。嗯,病人说,“不,我想尽快服用。”你知道,Ava 说,“好的。我们准备好了就给你发短信。”然后它给出了一个方案,在这种情况下,这是一个 SVG,我们正在上面添加时间和日期,对吧?所以,你知道,相当直接,我们正在软件中这样做,LM 没有这样做,LM 实际上只是传递指令,你知道,它说发送步骤一图像并提供,你知道,像这个日期和这个时间,然后我们替换其余的部分,这会作为 MMS 发出,对吧?所以,这是一个短信。嗯,所以我们提供这个,病人,你知道,说,你知道,在这种情况下,我们正在谈论,你知道,再次,这是 LM 在推理这一切,对吧?你知道,我正在立即发送这个,因为它实际上是在你告诉我的 35 分钟窗口内,我必须发送这些东西。这是 LM 几乎实时解释的所有业务逻辑。嗯,然后我收到这些提醒,对吧?我没有回复。所以,这是一个重要部分。它发给了我这个东西,它认为我会在 5:45 服用。我没有回复,对吧?部分原因是我自己维护系统,我忘了。所以,我不得不第二天回来,赶上进度。嗯,所以它发送了一个自动提醒,因为它在发送第一条消息时安排了一个。所以,部分原因是只有当病人说什么的时候,LM 才会被调用。所以,如果他们不,你知道,你必须确保你保持参与,对吧?你不会过度这样做,我们不会试图打扰人们超过一两次提醒。这是他们的治疗。嗯,但这种“推动”功能对客户来说非常重要,对吧?所以,我们把它建进去了。嗯,所以,你可以看到我第二天回来了,我说,“是的,抱歉。我确实服用了。”Ava 确认我完成了第一步。它所做的是设置一个叫做“锚点”的东西,对吧?它说,“好的,你知道,病人本来会在 5:45 服用,他们确认他们已经服用了。”所以,现在,你知道,我可以参考这个。我知道这件事发生了,对吧?如果病人后来又说,“哦,不,我搞砸了。我实际上还没有服用。我今天就服用。”我们只是改变锚点。我们更新一切。对吧?所以,这是人类曾经必须做的一个系统。如果病人回来告诉你,我没吃药,你知道,一个人必须手动进入并更新所有的时间和所有安排的消息。这真的很麻烦。嗯,是的,请。实现这个功能,病人报告状态不完全是,嗯,我们处理状态的方式,我会花很多时间讲这个,但我们处理状态的方式是,基本上,对于病人发来的任何消息,这个整个系统只有在病人发来消息时才会启动。我们说,好的,考虑到这个状态,最好的回应是什么?这个回应可能是,我改变了其中一些锚点。我更新了他们的治疗阶段。我安排了很多消息。所有这些状态都被保存下来,以便下次他们写信给我们时,你知道,我们就有那个状态可以继续。嗯,但再次,我们不检查,对吧?系统中没有轮询,我们说三个小时后,病人有没有回复我?我们不这样做。我们依赖于安排好的消息来提醒病人。如果他们选择三天不说话,然后三天后回来,我们就接着讲。再次,这是一个选择。这是客户想要的。它旨在低接触,以免打扰人们,但又足够高接触,以免丢失跟踪。当然。嗯,我在这里暂停一下。到目前为止还有其他问题吗?嗯,我意识到我讲了很多。是的。你的锚点必须是连续的,还是你的用户可以随时进入?他们可以。很好的问题。所以,问题是锚点是否必须是连续的,或者你必须一步一步地完成?所以,这个系统最棒的地方之一,也是最好的地方之一是,我可以,而且我很乐意稍后尝试一下。我可以基本上说,“哦,是的。我已经服用了第一粒药,而且我正在服用第二粒药,这是我说的第一件事,Ava 会说,“好的,没问题。有一个锚点。这是下一件事。”它会跳过去,不会强迫你经历这个蓝图的规定部分,而旧系统,你知道,至少名义上是这样,对吧?就像你可以,你可以跳过去,但这个系统会自动完成。你知道,指令的一部分是不要问病人一个他们已经回答过的问题。就是这样,对吧?但那很烦人。别那样做。嗯,所以,所以是的,这非常重要。还有其他吗?是的。这个决定过程的内部状态机概念,还是基本上外包给了实际的软件?是的。所以,问题是,LM 是否有内部状态表示?嗯,有点。所以,你会看到,当我们进入与 Claude 的实际来回交流时,在 Langmith 中,你作为人类可以看到它从哪里开始,所以每个线程都会显示,好了,这是传入的状态,我们基本上再次重复给 Claude,这只是一个点,我从来没有成功地与 lang graph 连接过,所以我们基本上必须序列化状态并说,这是你的,这是你的起点,但然后 LM 在它的窗口里,然后,你知道,它会调用函数来更新状态,它总是可以再次询问,它可以说,现在的状态是什么?我可以回去检索它。嗯,但从病人回应到我实际回应他们的那一刻起,整个过程都会在它的记忆中。你有没有遇到过状态问题?嗯,所以,简短的回答是,问题是,我们是否曾经遇到过状态太大?一般来说,因为我们如何在对话结束时进行压缩和序列化,它从来没有大到无法完成响应一个情况的工作,你知道,就像病人说了这个,现在我要做这个。我们考虑过让更长的线程,你基本上在中间接上,你已经可以重新加载整个之前的对话了。这确实很奇怪,尤其是对于旧的 Claude,你会发现它忘记了正确调用工具,而且它有很多 JSON 错误。我们有很多重试逻辑来弥补这一点。嗯,所以,这是我们将其保持简短的一个原因。我们让它基本上丢弃所有东西,并在病人回来时重新开始。部分原因是蓝图可能会改变,对吧?你有很多事情可能会改变,这可能会导致一些奇怪的事情。

状态。因此,在管理状态和做出下一步决策时。是的。所以这是 100% 由 LLM 驱动,还是有一些更柔和的逻辑围绕着它?它是 100% 由 LLM 驱动。呃,抱歉,问题是,转向是由软件完成的,对吗?任何转向,答案确实是没有,它不是,除非它浮现给人类,对,所以当它需要人类批准时,人类可以使用英语,基本上说,是的,将那个词改为那个,并且不应该发送该消息,你知道,无论如何,所以,就像我们实际上作为灵活性的一部分,我们没有构建任何管理状态的软件,我们只是希望你与 LM 对话来完成它,对,我们认为这是一个更好的实践,对,这意味着,你知道,你作为人类只需要与它对话,而无需弄清楚如何在新控制台上翻转所有位。您有任何机架系统吗?其次,如果病人偏离了旅程,您如何检测到?抱歉,第一个问题是什么?您有任何机架系统或 Rex 吗?抱歉,我刚听懂。检索。哦。哦,明白了。抱歉。所以,呃,问题是,是否有 rag?呃,不,没有。而且实际上只是因为我们真正做的是,我们只是想出了一个文档结构,它是自我引用的。所以你读了一份非常小的文件,上面写着这是治疗方法,对,如果你需要为这个阶段阅读,请转到这个文件,对,如果你需要为那个阶段阅读,请转到那个文件。如果你有一个问题不属于任何这些事情,这里有一个包含大量问题和答案的 CSV。我们没有将其作为 rag 来做,部分原因是我们不相信我们能够很好地将所有正确的信息放入窗口。就像我们不认为我们会足够可靠一样。我们只想提供整个文档。它们不是那么大。嗯,因为这是被抓取的,对,它有一个足够大的窗口,我们可以将整个东西放进去,你知道,对于大多数治疗。所以,我们选择这样做。但你的第二个问题是什么?病人是否偏离了典型的旅程?是的。您如何检测和拦截?对。所以,问题是,如果病人偏离了轨道,我们就有这个蓝图的想法,但有很多情况是蓝图可能,呃,你知道,不能完全回答病人提出的任何问题。嗯,例如,蓝图非常注重提问,对,所以你会说你已经服药了吗?你打算什么时候服药?病人会说我肚子疼,好的,所以是的,你肚子疼,你没有回答问题。我们所做的是,病人通常会得到他们问题的答案,所以原则之一是始终回答病人的问题,对,我们永远不想让他们悬而未决,但然后再次询问你的问题。所以想法是,在任何给定点,我们都可以回答他们需要的任何事情,并且尽可能温和地,我们会尝试将他们拉回到蓝图上,以便我们了解他们在治疗中的位置。嗯,这不是一门精确的科学。但是,呃,有没有办法检测到有人,嗯,LM 通过知道它应该让人们留在蓝图上,但有一个知识库的逃生舱,基本上我们称之为,对,分诊或知识库,你知道,无论你想怎么称呼它。嗯,所以,你知道,我们没有明确的位被翻转到系统中,会说这个病人偏离了轨道。我们只是大致知道他们在治疗中的位置,如果他们想回答,如果他们想问很多问题,我们会回答他们,直到他们满意为止。好的。呃,是的。是的。是的。所以问题是我们为什么选择 langchain,我们是否仍然,呃,我我将非常坦诚地说,我选择 langchain 的主要原因是,我个人已经对 langgraph 作为这些概念的演示相当熟悉了,对,它不是那个,我的意思是,我们在早期做了很多 autogen 工作,你知道,我做了一点 crew AI 的工作,所有这些框架都可以有效地做非常相似的事情,langgraph 在向那些不深入研究这些东西的人解释它是如何工作的方面是最好的,对,而且因为有通往生产的道路,我不需要重新平台并改变所有这些。我们当然考虑过,对,我们考虑过,如果我们不在 Langraph 中这样做会怎样?我们会得到什么?但答案是,你仍然需要在某些方面实现可观察性。你知道,你并不一定能得到,你知道,你可能从 Langchain 获得的,如果你最终在一个地方。记住,我们也在为客户做这件事,我们不会永远在那里。嗯,给他们留下一些他们可以打电话给某人支持的东西也是有帮助的。所以,我认为,我认为我不会做不同的事情。我认为这真的只是,你知道,最终,你知道,我们都在被推向使用原生模型工具来做这件事,对,你知道,openai 有响应 API,它允许你定义工具,云有它的新东西,对,我真的不想被锁定,嗯,我,我一定程度上被 lang chain 锁定了,但我宁愿那样,而不是被模型锁定,嗯,这些,这些不是我们正在做的性能密集型的事情,就软件而言,对,你知道,我不在乎 lang chain 有时有点慢,我宁愿有选择。所以你说你没有使用规模,那些如何,呃,它只是因为他们有,抱歉,问题是关于,如果不是 rag,我们如何获取文档?文档相互引用,所以你会看到我们有一个概述 MD,对,这都是 markdown 格式的,有一个概述 MD,告诉你治疗中涉及的其他文档,对,有一些提示说,你可以随时请求分诊概述,对,来尝试处理问题。嗯,它会在那里,对,无论治疗是什么。所以,它非常像一个文档管理的东西。嗯,rag,主要问题只是,我我不认为,而且,你知道,这可能会在我们深入研究时变得更加明显,对,我我不认为你真的可以设计一个 rag,它能以一种完美相关的方式拉回所有东西的片段。你真的需要了解整个治疗的形状,对,才能做出好的决定,对,否则,你只会重复 rag 碰巧带回来的任何特定片段,然后所有的逻辑都必须在 rag 中。这样做更有意义,而且我认为更透明。也许你稍后会谈到这一点,关于状态管理。锚点是否预定义在蓝图中,还是它们,它们主要是由蓝图预定义的,我们说作为概述的一部分,你知道,锚点的概念是它是一个发生的事情或将要发生的事情,这里是这个治疗的例子,对,这是在这个治疗中将要发生或已经发生的事情。抱歉,那是关于锚点的问题。是的。所以当你,你提到你对话并且你跟踪,呃,不,所以状态基本上是,你知道,我们称之为,只有工程师才能理解的原因。我们称之为调度文档。对,想法是,对于任何给定的病人,都有一个他们正在进行的计划,而文档则快照了他们在某个给定点的当前状态。对,它是一个版本数据库。所以我们可以回到过去,我们可以看到三天前他们的文档是什么样的。嗯,但在任何给定点,它都有已交换的消息,任何已安排但未发送的消息,以及关于他们治疗的足够状态来填写此视图。是的。呃,是的。所以在这种情况下,所有这些东西都被锁定了,对,所以,我的意思是,只是回到这个图表一会儿,这个整个东西都在 AWS 的 VPC 后面,对,所以,没有外部访问 LLM,绝对没有。它唯一能与之交谈的是它自己的文档,你知道,在本地文件中,以及蓝色的盒子,所以,你知道,当然有向量,但向量是通过文本消息,而不是通过其他任何东西,对,哦,抱歉,一群人,你的第一个问题,我猜是双重的,就像我们如何评估模型响应的置信度,第二个是如何安全地进行注入以防止恶意行为,是的,嗯,所以,问题是关于提示注入和一般转向,嗯,我的意思是,基本答案是,你绝对可以通过发送奇怪的文本来欺骗模型,对,我们将其作为我们内部红队演习的一部分,我们有一个完整的运营助理团队,他们花了数周甚至数月的时间来欺骗这个东西,而且,他们并不是试图从泄露专有个人医疗数据来欺骗它,你知道,我的意思是,有这样的事情。我们还模糊了许多医疗数据。所以,进入黄色框的东西不包括电话号码。它们不包括除病人名字之外的任何东西。嗯,所以有很多数据只保留在蓝色框中,这更容易防御。嗯,所以,是的,我们非常模糊病人。我们不模糊治疗,对,治疗对 LM 是完全可见的。是的。酷。是的。是的。请记住这一点。我很快就会谈到。嗯,我们回来了。呃,抱歉。这只是一个关于不清楚指令的问题。嗯,所以,呃,当情况模糊时,LLM 被告知要查看蓝图并选择最佳答案。现在,如果你不相信 LLM,如果你不相信答案是完美的,你应该在理由中说明。所以,如果我回到这里,这个理由的想法,如果模型有不确定性,它可以说,我选择了这个蓝图响应,但我不能确定它是正确的。实际上,它在这方面做得不好,但这就是想法。然后评估者也会看这个,然后说,好吧,你是否真的逐字选择了确切的蓝图响应?你是否改编了它?你知道,这对你来说似乎是正确的吗?就像我们试图在到达人类之前至少提供一点点层次。然后希望我们可以捕捉到这种情况,然后说,好吧,这是一个复杂的情况。应该由人类来查看。嗯,这不是一门精确的科学,就像这东西通常都是这样。抱歉,你那边。是的。嗯,所以问题只是关于负载和规模。所以,呃,简短的回答是,这个系统存在,有一个现有版本是人类在按按钮。那个规模是,再次,假设是数千而不是数百万的病人。这打开了做更多治疗的可能性,对,这就是我们如何获得额外的病人规模。你也可以把它卖给新的医院、新的诊所等等。所以,一部分是为了获得更大的规模。我们没有遇到规模问题,你知道,只是与克劳德的对话。你知道,我们正在构建的软件的规模将远远大于数千用户,你知道,短信网关实际上可能是最大的瓶颈。所以,老实说,这是一个我们想要的问题。请继续。所以,嗯,你一直说你有没有选择模型,还是有特定的原因让你选择 35 或者别的什么?是的。呃,所以关于模型选择的问题,当我们开始这个的时候,对,而且我认为,你知道,假设我们启动了这个项目,你知道,去年年底或今年年初,我们不得不做出选择,而我们的主要标准是它必须是一个可控的模型,我们对此相当满意,你知道,透明度方面,你知道,举个例子,只是给你一个具体的例子,mini 在这个工作流程方面做得很好,但它不会显示它的推理,就像,我的意思是,这只是一个例子,而且,这不是一个交易破坏者,我们仍然可以看到理由,你知道,有一些部分,但我喜欢能够进入 lang,看到整个对话,对,那真的很有帮助。我们需要,你知道,再次,灵活的托管,但我的意思是,所有的云都这样做。坦率地说,我们不想和微软打交道,我们有点偏爱 AWS 而不是谷歌。我们就是这样走到这一步的。但是,你知道,你可以在任何地方做到这一点。基本上就是我们必须选择一个,而且我们基本上没有后悔过,部分原因是我们构建了足够的灵活性,如果我想切换,我仍然可以。是的。是的。呃,所以问题是关于通过文本载体传输数据的敏感性,以及使用数据来学习。我先讲学习。嗯,我们不,我们不采取任何响应,也不对模型做任何事情,除非当我们看到我们作为人类评估过并发现不足的情况时,我们可以调整提示和指南,对,但我们没有将其放入任何持久形式,最终,你知道,我们相信这里的正确模型是提供者交互,如果有一个提供者参与,它会持续下去,对,提供者知道你与系统交互,他们可以拥有,你知道,他们需要的任何记录,否则,你知道,当你的治疗完成时,我们就忘记你了,我们认为这样更好。嗯,关于敏感性问题。是的,存在敏感性,同时,再次,这些产品有先例,对,存在现有系统,它们基本上接收文本消息并提供医疗建议。我们只是试图遵守这些准则。而且,再次,这是我们不希望 LLM 实际拥有任何不明确需要才能做出决策的数据的原因之一,对,它不需要任何超出这些的东西来做出好的决定。好的。是的。每个响应都是 100% 确定的,那是 100% 的情况,并且有通知。是的。抱歉。也请记住这一点,因为我很快就会谈到。嗯,让我继续。呃,请把这些问题再提上来。我只是想再往前走一点,这样我们就能看到一些其他很酷的东西。嗯,我将从这个流程中移开,因为你可以想象这需要几天时间,对,这里还有另一个步骤,步骤二,有更多的药物被分发。然后,你知道,最终我们会到达终点,对,你知道,基本上你完成了这个,然后好的,太好了,你知道,这就是将要发生在你身上的事情,你知道,你会看到一些出血,然后我们有一个签到,所以想象一下,现在这已经是,假设是三天或四天后,对,治疗已经开始,你知道,我们签到,你知道,病人会回复,或者不回复,对,记住,一些病人会说,我完成了,我真的不想再和这个东西说话了,但如果他们这样做了,我们继续治疗,我们不打扰他们,我们只是让他们继续从他们离开的地方继续,再次,我们有这些理由,你知道,我们有这些问题,然后我想在这里做的是,只是简要地展示一下,抱歉,我得缩回一点,这样我才能看到完整的电话号码,它看起来像什么。所以,如果我在这里进入我的沙盒,想象一下,通常这会是一条短信,所以,你知道,我会在手机上做这件事,但在这里,你知道,我可以回答这个问题,如果我之前有过任何怀孕系统,它们是否减少了?就像是的,它们减少了。好的,所以我发送这条消息,现在会发生什么?它正在思考,所以这一切都不是即时的,所以现在我想展示一下 Langmith 中的样子,所以,你可以看到这里有几件事,一个是这个,这个现在正在旋转。所以,我刚才问它的东西现在正在积极处理中。我将向你展示完成后的样子。但是,我会给你一个简短的看一下,我认为这可能是一个有用的,嗯,它实际上在处理状态方面看起来是这样的。所以,我会把它放大一点,让它更大一点。所以,你可以想象这是在使用 sonnet 4。嗯,是这样的,每次病人发来消息,我都会得到这个。好的,我得到这个描述,你知道,这里发生的一切。我可以看到这是一个 AVLA 病人。我可以看到我们目前正在执行的线程,对,因为如果你需要提供反馈,你可能需要恢复这些线程。我有一个想法,我处于三天签到阶段。所以,这是我要阅读的蓝图。嗯,然后我有几件事。我有这些锚点,对,你知道,你可以看到。我认为这和你之前看到的完全一样。嗯,在同一个病人身上。嗯,这些都被定义为,你知道,实际上是 UTC 和东部时间戳的混合。这是很难根除的问题之一。让 LM 很好地处理时间真的很难。嗯,然后我有这个完整的消息队列,对,这是到目前为止对话的压缩状态,对,这不包括克劳德在思考时发送的每一条消息,对,那部分包含在这些单独的 Langsmith 线程中。如果需要,我可以回去看看。嗯,但我所做的是压缩,基本上说我真正关心的是来回交换的实际消息。我想要这些理由,因为我想回顾它们,对,这有助于我理解正在进行的决策。嗯,你知道,我想这些置信度分数,这样我就可以回去看看,你知道,在任何时候它都认为是什么。而且,再次,我会给你看一个置信度低的情况。但这些东西可以持续一段时间,对,这可能,我不知道,20 到 25 条消息,对,所有这些都作为初始上下文进入窗口,对,所以,如果你有 150 条消息,所有 150 条都可能进入。现在,我们有一个函数,你可以选择将其设置为压缩,然后说,好吧,只给我看最后 50 条,对,如果我需要更多,我可以这样做。有一种方法可以做到。嗯,但我不需要将整个东西都放在窗口里。嗯,所以,我向下滚动到这里。这是病人发来的最后一条消息。对,所以问题是你注意到血栓了吗?我说是的,有几个。对,你知道,那就是我作为病人说的。克劳德现在将开始处理这件事。对,所以想象一下,你知道,所有这些基本上都被粘贴到,你知道,一个克劳德窗口中,然后让它通过这个过程并调用工具。它首先查看它允许查看的目录。再次,这是一个版本,它有蓝图基本上都是本地的,而且它通过这种方式与它们交谈。我们有另一个版本,它通过 MCP 与蓝色框,对,更大的系统交谈。所以,它弄清楚它有什么目录。它阅读这些基本目录,因为这些需要在所有情况下阅读。所以这些指南,对,你如何做你的工作的想法,对,置信度框架的样子,治疗的概述,对,你知道,这些东西。我们提前阅读了它们。这些都不大,对,所以你读了所有这些东西,你知道,它进入窗口。嗯,然后你知道,基本上它阅读了这些描述,然后说,好吧,我被告知作为这个的一部分,我必须阅读当前阶段的当前蓝图,对,所以,我单独阅读了那个文件。所以,很多早期的调用只是为了设置上下文。这不是唯一的方法,对,我,我的意思是,这是我们选择这样做的方式。再次,我们选择不这样做 rag 有几个原因,你知道,我们只是不认为我们可以得到足够好的结果,而且因为这实际上更容易解释,对,你可以大致了解它在做什么。我到达了蓝图。蓝图。而且,我们会稍后看到更多这些例子,但蓝图基本上是这种结构化的项目符号列表,对,这里是你可能需要告诉某人的所有事情,对,你知道,当用户说某个特定事情时,你会怎么做。这实际上并没有那么具象。它只是结构化的,对,这不是一个 if then 语句,对,它有点像那样,但它不是一个真正的 if then 语句。所以,像这个格式,你知道,是我们迭代并达到一个点,在那里我们实际上得到了很好的结果。嗯,但是,你知道,这并不是 100% 显而易见的,这就是前进的方向。嗯,你知道,我们从图表开始。嗯,所以现在你到达了这一点,现在你可以看到,好吧,现在我必须看看这些,你知道,呃,对话。我必须弄清楚这里发生了什么。所以,你可以看到这里,即使我传递了状态,它也有一个列出消息的函数。所以,它基本上说,好吧,现在我大致知道发生了什么,让我看看最后五条消息,对,你可以看到它将开始发送,你知道,很多这些。嗯,所以它这样做了。它查看是否有任何安排。没有,对,所以现在它说,“好吧,这是克劳德做它的小解释事情的时候了。我明白了。病人处于三天签到阶段。我已经问过了出血和痉挛。我问了血栓,病人,你知道,基本上只是说是的,他们有血栓,所以我就继续下去,对?”然后它去问怀孕系统的问题。这条消息直接来自蓝图。好的?而且,我稍后会在一个谷歌文档中展示它看起来是什么样的。嗯,所以它安排了它。说你应该发送这条消息,你知道,只要你想。然后我们到达了这个评估流程,对,评估者说,“好吧,我要看看这个情况。我要看看所有需要置信度评分的东西,对,新消息是唯一的东西。这是,这是唯一刚刚发生的事情。嗯,我将立即发送它。这只是一个即时的时间戳。然后我得到这个报告,对,我们设置框架的方式,嗯,而且,我会用代码更清楚地展示,你知道,我们是否知道用户在说什么?我们是否知道该说什么,我们是否认为我们做得很好?再次,这是一个艰难的问题,对,一般来说,LLM,你知道,一直说,“是的,我知道我在做什么。”而且,你知道,像,走开。嗯,但我也能做的是,我可以说,“好吧,然后有很多情况,如果我设置了一个锚点,如果我更新了病人的数据,比如我改变了他们的时区偏移量,我改变了他们的名字,对,那是一件奇怪的事情,你知道,如果发生了,你可能希望人类来看看。我发送多条消息吗?我发送重复的消息吗?我是否有已经发生的事情的提醒?所有这些都会从分数中扣除,并导致人类介入。对,这是我们如何做到这一点的一部分,就是结合模型是否认为它没问题?对,这是上半部分。然后总体而言,是否有我应该尝试捕捉的奇怪情况,对?我应该展示给人们审查?嗯,在这种情况下,什么都没有出现。我更新了置信度。它是 100% 的置信度。嗯,然后基本上虚拟 OA,你知道,作为最后一件事,很难让克劳德不总结自己。它确实做到了。它基本上只是说,我做了所有的事情。我很好。然后,如果你向下滚动到这里,底部,这是输出状态。所以这个输出状态说,好吧,我有 100% 的置信度,再次,它的版本,我做了正确的事情。我,你知道,这里是我的锚点,这里是我的消息,这里是未发送的消息,我将要发送。而且,因为它是 100% 的置信度,它就发送出去了,对,它回到短信网关,然后就发送出去了。这是一个风险,对,你知道,如果你想完全安全,你让一个人审查所有这些事情。我们不想这样做,因为我们试图扩大规模,对,所以,我们通常对那些,你知道,返回 100% 置信度的东西感到满意,我们只是发送那些消息。问题在那边。是的。是的。稍后遇到麻烦。呃,是的,所以问题只是关于我们如何确定,你知道,可能存在置信度问题的那些情况?它非常手动调整,并且面向这个评估团队,基本上是现在作为人类存在的虚拟 OA 团队。我们会审查,你知道,在抽查中,你知道,很多情况只是为了看看,嘿,这看起来还好吗?当病人回复时,因为有时病人会回复说,你错了,那不是我说的时间,你知道,我现在正在服用。置信度系统很擅长捕捉到这一点,并基本上说,好吧,即使我认为自己有信心,但有些事情是错的,你知道,人类应该看看。但是,我的意思是,答案是,它更多的是艺术而不是科学,即使现在我们也不是完美的,而且因为我们想扩大规模,我们选择说,看,最坏的情况是,基本上发生了一些奇怪的事情,几条短信来回发送,只是错误的。通常人类会介入说,这听起来不对。对,这不是病人有危险的情况。你知道,如果他们说,我正在出现这些症状,你没有帮助我。人类会介入。这是我们擅长标记的事情。是的。是的。是的。我的意思是,所以简短的答案是,我们可以查看最终被评为低置信度的交互,然后我们可以从那里追溯,对,所以我们所做的很多事情是,当某件事被标记出来,而一个人说,嗯,这里有什么奇怪的事情,你知道,我们会在内部分享这些,对,我之前提到的 Slack 频道,他们与内科医生助理交谈,很大程度上被重新用于人们说,嘿,这种行为不对,你能去看看吗?然后这基本上进入了我的队列,你知道,我得去看看我的评估,我得看看我能做什么来捕捉它,也许是改变这里的行为。所以,通常是这样,当我们知道有问题时,我们可以回溯。这是简短的答案。这边,我很好奇,人类也会犯错。是的。你有来自,比如,人类响应的百分比与人工智能的百分比的数据吗?是的。问题是关于人类与人工智能的错误响应,来自之前的数据。所以,是的,这是一个很好的问题,而且,是的,答案是我们确实有这些数据,这也是客户对让 LLM 运行得如此舒适的原因之一,对,就是这个想法,人类确实会犯错,当他们被升级时,你知道,你可以回顾并说,“哦,是的,那有点不对。”你纠正它,然后继续前进。这有点独特,因为再次,它需要,你知道,精确措辞,就像,最大的风险之一就是你给出标签外的医疗建议。但如果想法是,比如,哦,你误解了,你必须回去纠正自己,那没关系,对,那不是致命错误,对,所以,很多时候,你知道,我们认为我们可以通过审查这些情况来更好地利用我们的人类,而不是让他们按按钮,因为他们偶尔会按错按钮,对,和机器人一样。所以,谈论错误,而且这已经运行了一段时间了。是的。你有没有想过用去标识化的消息来微调模型,比如让它重新运行一遍?是的,我的意思是,所以问题是关于我们如何看待微调。嗯,在我们从事这个项目期间,我们已经看到了两次主要的模型发布。我们通常不认为微调是我们的钱的一个很好的用途。它,它显然可以更便宜。我,我的意思是,一个例子是,我们曾经尝试过使用 Haiku,你知道,Haiku 甚至不便宜多少。它的成本可能只有三分之一,对,我们到了一个点,我们改进了我们的蓝图,部分原因是因为,就像我们有一些捷径,我们不必像对 sonnet 那样精确,你知道,我们必须对 Haiku 更精确,然后它就奏效了。Haiku 没有处理好时间问题。Haiku 在弄清楚它需要何时“放置”东西方面非常糟糕。所以,我们必须在那里做的类型,就像它要么只是需要一个更聪明的模型,而且有来自多个人的更聪明的模型,比如 04 mini 实际上是两者兼有,你知道,我的意思是,它的成本比 Haiku 便宜一点,我认为,对,而且它和 sonnet 一样聪明。我们选择不使用它,部分原因是因为它不那么透明。但是,所以总的来说,我们不认为微调是必要的,因为我们认为模型会越来越好,越来越便宜,而且我们,你知道,我们可以整体切换,而不是微调某些东西。所以,当你经历那种,你和模型有这种“喋喋不休”,它在描述它的行动,然后调用工具,这是故意的选择吗?我觉得你可以直接跳过,直接输出。嗯,所以是的,这是故意的选择,对,这部分是因为我们已经得到了理由和一般的,你知道,对其行动的解释。嗯,但有时你想说,看,它为什么这样做,你知道,如果它在思考,就更容易捕捉到。嗯,所以是的,我们有可能消除其中一些。我们真的不认为这是值得的。最有可能的是,你会遭受二次伤害。目前的结构是如何设置的,以便你有一个新的锚点来看到这个人?是的。呃,很好的问题。所以,关于基本上是多个治疗或在经历治疗后再次回来,对,有几种方法可以做到。所以一种是,你知道,再次,取决于你如何到达那里,如果你扫描一个二维码,它可以开始一种新的激活,所以我们可以知道你第二次来。但人们会在两个月后回复说,我有一个问题,对,所以我们可以重新激活那个对话。另一件事是,不同的治疗通常来自不同的电话号码。所以,有几种不同的方法可以区分,你知道,某人实际上在做什么。但那种想法,你知道,同样的事情又发生在我身上了。我又要开始这个方案了。从根本上说,你可以解释一下。你只需说,“嘿,我两个月前流产了。我又一次。你能帮我吗?”它就会重置自己,对,LM 足够聪明,可以做到这一点。我能分享一些吗?请?因为有很多可以分享。我的意思是,显然,意图是改进两个意图,我猜我怀疑将成本翻倍是否会产生更好的问题,你有一个漏斗,说明评估者可能有多频繁地进行第二次提问,他们都对,在这种情况下,是的,是否有故意的决定坚持使用,而不是切换模型,在理论上,假设你有一个不同的大脑在看另一件事?是的。最后一个问题,抱歉。不,不,请。嗯,是否包括这个评估?所以,除了这只是一个性能问题之外,还有其他影响吗?是的,所以问题都是关于评估节点和流程。所以,呃,最短的答案是,嗯,是的,我们也对此表示怀疑。同时,我们认为仍然有价值去尝试,你知道,基本上是第二次机会,对,我们确实认为,仅仅拥有一个不同的系统提示在同一个对话中偶尔会产生更好的结果,但你可以让虚拟 OA 评估其自身情况的复杂性。我不认为你能让它评估它是否正确,因为通常 LM 在这方面都很糟糕。所以,我认为基本答案是,我们想要灵活性,部分原因是我们也可以尝试完全不同的模型,对,或者你知道,有一个东西,也许你,也许你微调了一个模型来专门捕捉这些错误,对,就像我认为这完全不是疯狂的。嗯,所以,是的,我们想要那种选择权,而且在这个阶段,你知道,它还很早,再次,它正在运行,它在那里,你知道,我们还在调整它。如果我们到达一个点,我们说,看,唯一的问题是它的成本是多少,或者关于它在捕捉错误方面的具体细节,我们会更努力地去解决。但我们相当满意,它通常会升级需要审查的情况,对,它有时会搞砸一些事情,只是因为它认为它很容易,而它并不容易。这种情况确实会发生。人类也会发生这种情况,对,所以,我们基本上达到了我们最初为自己设定的标准。这是一个很好的区别。评估者有不同的任务。它确实有。它不是真的两次做同样的事情。正确。评估者正在从不同的角度看待它,并且有明确的,所以,实际上有一件事是,评估者可以看到 VA 应该做什么,对,它可以看到指南。所以,它基本上可以说你没有这样做,因为我知道你被告知该做什么,而你没有这样做。同样,虚拟 OA 也可以看到评估者的置信度框架,它可以说,好吧,我将根据这些事情进行评分。你知道,我最好做到正确。再次,这更多的是艺术而不是科学,但,但我的意思是,你问的是正确的问题,关于,我们能否找到一种更优化的或更便宜的方法来做到这一点。我认为答案是肯定的。好的,让我再继续一会儿。请记住你的想法。嗯,所以再次,这个想法,就像每一次交互看起来都像这样。它是一个起始状态,一个对话,一个结束状态,然后返回系统。所以,我想在这里展示的是,如果我回到一个对话,对,事实上,让我看看我有什么。哦,是的。事实上,这个回答了。所以我说怀孕症状减少了。蓝图中的下一个问题是,你认为你完成了吗?对,你知道,你认为,你知道,流产和,你知道,这些药物应该引起的改变已经完成了,对?嗯,基本上还有一条消息,确认并说,嘿,如果你有任何问题,请告诉我们。但是那种交互,对,来回,来回,评估当前状态,这就是它的构建目的。而且,在每一次交互之后,我们都会压缩,只保留在给定时间内发生的对状态的更改。对,我们不保存,你知道,在 Langmith 中,我们保存整个对话,对,这些数据,抱歉,那是错误的标签。这些数据,你知道,关于虚拟律师和评估者彼此说了什么以及他们调用了什么工具。这些都保存在 Langsmith 中。我们不会丢弃这些,对,但我们不会在蓝色框的状态中保存这些,对,那不是病人与我们互动的一部分,而且我们也不会在每次你带着新消息回来时重新加载它,因为这最终会混淆事情并炸毁上下文窗口。所以,这就是我们选择这样做的方式。嗯,所以,现在让我向你展示这个。嗯,我还有另一个对话,实际上需要回复。所以,我将把它放到沙盒中,这样你就可以看到它是什么样的。抱歉。我只是得到了持久性。呃,抱歉。持久性,如果你只有什么?你只是不保存模型互相交谈的过程,对,你拥有它。如果你需要,你可以参考它。它是一个调试工具。是的。是的。输入和输出是我们快照的全部内容,在更大的系统中。好的。所以,现在让我们看看这个。所以我认为这实际上是错误的。让我再找一次。好的。是的。所以,这,这实际上,你知道,我我不需要去沙盒里看这个。这是一个例子,说明当事情变得足够复杂以至于我们要求人类审查时会发生什么。好的。所以,在这种情况下,我刚刚开始了这次对话。好的。我说,“是的,我拿到了我的药,是从诊所拿来的。这是我的时间。”现在,在这个治疗的某个时刻,很多事情正在发生。我正在弄清楚他们在哪个时区,对,我将它作为病人数据的一部分保存,对,所以,在这种情况下,我说我在西海岸时间。所以,我的时区偏移量是 UTC 前 420 分钟。我正在进入治疗的新阶段。我有药。你知道,我现在不在入职阶段了。我实际上在服药,而且我发送了多条消息。所以,在置信度框架中,我认为我可以找到它,但直到我们到达那里我才深入研究。嗯,在置信度框架中,我们说当你一次性发生所有这些变化时,你应该从你的置信度分数中扣除。所以,你在这里看到,这个置信度是 70%。我将阈值设置为 75%。所以,对于任何低于 75% 的情况,我都会停止,并要求人类批准,对,所以,如果我批准了,它只会说,“好的,这些变化没问题。”在这种情况下,这些变化没问题。或者我可以提供反馈,对,我可以这样做,我现在就试试,现场演示就见鬼去吧。嗯,比如说,你知道,我想说,请在你的下一条消息中,在你的消息中提及病人的名字。所以我将说提交反馈。好的。我正在处理这个问题,因为这是一个操作细节。嗯,这现在正在再次思考。所以,我稍后需要重新加载它,然后看看发生了什么。但实际上发生的是,如果我再次转到 Langsmith,我应该能够做到,看到现在发生的是,它正在重新启动一个我已经开始的线程。所以,我们擦除它的大脑并重新加载所有东西的唯一例外是当你带着这个反馈回来时,对,因为你想基本上能够直接进入线程说,“嘿,你刚才做错了,但这里其他的一切,你知道,你需要能够看到你是如何走到这一步的,对,你知道,所以做出正确的决定并完成它。嗯,所以,我想我们在这里找到了。好的,还在思考。嗯,哦,看,所以,你可以看到这里唯一的变化是它提到了她的名字,对,否则就是一样的事情。相同的时区偏移量,相同的治疗阶段,相同的提醒。嗯,你可以看到这里的理由。嗯,而且,你也可以看到这里的理由甚至包括这个。我改变了它来更新名字。现在,你可以想象做一个这个版本,我只是有一个小编辑框,我说,“我要改变这条消息。”我们选择不这样做,对,我们希望 LM 实际驱动这些变化。我们认为人类以与人交谈的方式与他们交谈更好。这是一个有争议的选择,但这是我们做出的选择。嗯,其中一部分意味着我们可以对治疗非常非常灵活,对,我们可以只对情况提供反馈,而不是必须构建某种足够灵活的工具来处理所有不同类型的治疗。嗯,所以,在这里我将继续说批准。现在这些消息就发出去了,并且更改就完成了,对,我有,你知道,我的病人本地时间设置好了,我知道我处于蓝图的下一部分。好的,我将在这里暂停。我将要跳到代码。我认为我们还有大约 45 分钟。到目前为止,关于这一切有什么问题吗?我只想看看代码,因为我可以做那部分。你听说过客户吗?是的。嗯,问题是关于病人的反馈,以及它是情感化的。所以,是的,绝对。所以,请记住,这是一个病人或客户已经在运行的系统,对,所以,从根本上说,他们已经相信他们正在与人类交谈,即使他们不完全正确。即使是按按钮的人也只是在调用基本上是机器人生成的响应。当事情变得情绪化时,人类可以介入。你知道,我们倾向于将他们引向批准的基于知识的响应。就像你不想让这个东西完全自由形式一样,有,有

出于法律和其他原因,不应这样做。因此,通过介入并让 LM 做出决定,并不会真正改变这些治疗的当前背景。他们已经得到了,你知道,基本上是这种经过医学批准的反馈,你知道,基于一个特定的流程图,如果它变得有点疯狂,升级点通常是打电话给某人,对吧?你知道,我们不会一直用文本来谈论,因为那很混乱。嗯,有很多点我在这里无法演示,它们基本上只是说,是的,抱歉,我无法回答这个问题。请拨打 911,去看医生,随便什么,对吧?但这通常就是它的发展方向。蓝图看起来很像那样。嗯,这是一个很好的问题。所以,老实说,其中一部分只是我们需要有一些病人,或者不是病人,客户实际上愿意维护的东西,对吧?因为请记住,其中一部分是我们不希望将此写在代码中,对吧?我们不希望这成为只有技术人员才能维护的东西。这就是他们以前遇到的问题,对吧?所以,我将稍微跳过一下,向您展示一下这大致是什么样子。所以,这基本上是客户正在维护的东西。我会稍微放大一下。我意识到这很小。嗯,但这里的想法是,我们正在使用框架中定义的术语,你知道,我们将在代码中看到更多这方面的内容。触发器你知道,是在事件发生后你知道,基本上是某种事情,对吧?嗯,你知道,我们有这些消息的对话。我们总是告诉 LM 为什么这很重要。如果我们只有这个细节,而我们只说这是你要发送的消息,我认为它不会表现得那么好。实际上,向 LLM 提供它为什么会说某事的理由会更有帮助,因为这样它就能做出更好的决定。嗯,许多怪癖之一。嗯,请继续。关于那个。我不确定这是否是代码,但对于下一部分,但语句有多么复杂,或者如果你有任何,实际上我迷失了。哦,当然。是的。所以,问题只是关于你知道,基本上为什么我们有这个框架,以及为什么它可能不是更具声明性的,对吧?就好像特别是如果然后之类的事情,对吧?实际上,我使用类似的,但索引不同,而且我迷失了,所以我不能写得非常复杂,没有太多嵌套,只能是一两层,对吧?我的问题,所以,答案只是关于再次,你如何定义这些东西,尽可能清晰,但可能不那么复杂。对吧?所以,嗯,这个框架倾向于这样工作,你只是说,看,我给你这个批准的语言,我试图给你粗体字,对吧?主要是我试图让你了解,你知道,到底是什么样的条件。但我们之所以这样做,部分原因是,你知道,如果病人在这件事之后写信回来,他说,你知道,是的,我有药,我吃了药,我的肚子疼,我感到困惑,对吧?我的意思是,这可能是所有这些事情。我们不希望在流程图中表示这样的内容。我们真正想做的是说,“看,这是事情的轮廓。你可以看到它。你知道,如果你需要跳过,就跳过,不要问病人他们已经回答过的问题。”事实证明,这个框架确实很适合让 LM 做这类事情。我知道这有点像魔法答案,但它做得相当好。呃,是的。不,我的意思是克劳德,是的,克劳德大部分都做到了。大多数都做到了。是的。包括指令会影响回复质量吗?呃,抱歉。你是什么意思,包括指令?包括推理。哦,推理。我,我,所以,问题是,包括推理是否有助于提高回复质量?我认为是的,对吧?我的意思是,这是我们开始时也借鉴了人类文档的东西之一,对吧?所以,这个过程最初是向将要按下按钮的人解释的。所以,我们结合了现有的流程图来解释治疗流程,以及这些你知道,在这种情况下你应该发送的消息,而这两种东西的混合输出。所以,我不会说我们对它是否真的更好进行了严格的测试,或者它只是说你知道,这已经足够了。更像是我们从我们拥有的人类材料开始了这个框架。关于那个的后续问题。是的。你发现你不得不做出任何牺牲吗?是的。所以,问题是,将这份文件作为人类可读的与 LM 可读的维护。是的,有取舍。我认为它们仍然是值得的。我们可能会在某个时候改变主意,对吧?所以,你知道,想象一下这里的流程,嗯,你知道,这个谷歌文档基本上是由我们的医生助理维护的,对吧?她是蓝图的共同所有人,可能在我旁边。嗯,当我们做出改变时,我们一起讨论它们。我们在该文档中推荐,然后接受它们。然后有效地我将其导出为 markdown 并进行检查。对吧?这将在某种程度上改变。我们将把很多这些工具构建到数据库中,所以这实际上是你将要做的。嗯,但因为这是人类,你知道,维护的,对吧?因为基本上,你知道,仍然由团队驱动。嗯,是的,我们正在做出取舍。我认为这不是一个非常糟糕的取舍。根据你目前的设计,是的,你刚才做的,当你做这件事时,它之后会发生什么变化,是一次性的,还是它会改进你未来的答案,甚至改变它,所以,目前?不。问题只是关于你知道,批准的,呃,反馈机制。嗯,所以,实际上我会回去快速展示一下。这现在应该完成了。嗯,好了。嗯,再次,我们正在以我可以看到它的方式保存它,你知道,在 lang 里。我可以看到这个,我可以看看,你知道,在这些需要批准的情况下,以及在这个例子中,就像只是一个视觉上的,你知道,反馈,每当你有一个图表为空开始,你知道,那就是这些情况之一,你知道,有一个批准的反馈推迟选择,我可以通过这个过滤,我可以看看我们实际上试图批准或提供反馈的所有事情,我们不会从中学习,对吧?我们作为人类可能会更新蓝图,我们不会将此再次放入训练数据,原因有很多,这些原因有点特定于情况,但你所以,你可以在这里看到,我可以一直向下滚动,我会尽量快速找到它。嗯,你会遇到一个点,人类说,好吧,是的,就是这样。所以,我们从,是的,从人类那里得到反馈。这基本上是我按下那个按钮并说“提供反馈”时发生的一切。人类对你的未发送消息有反馈。反馈是提及他们的名字。嗯,它又回到了正经事。就像,好吧,让我看看我发送的消息。我将更新这个。我可能会删除,不确定,实际上不,它只是原地更新了那个,我们重新评分了。我们说的一件事是,我们不改变人类审查过的东西的置信度分数,我们将其保留在原处,对吧?我们让他们再次审查,对吧?所以,在所有这些情况下,这实际上是一个更快,你知道,更简单的操作,对吧?所以,你可以看到这里的评估者基本上是,是的,这条消息没问题,但我们不会做任何事情,你知道,真正改变整体分数,嗯,所以,你知道,这是我们之后可以看的事情,对吧?但至少在这一点上,我们并没有真正尝试将其反馈给模型。它只是为了蓝图。只是对你的指标有一个概念。嗯,很多这些,你知道,超过一分钟,它说大约二十万。你怎么看,就像一个必要的邪恶?花费的时间,成本。不,不。我的意思是,它是一个必要的邪恶,而且实际上,只是为了指出这一点,嗯,我认为这些成本不正确。嗯,Langmith 的一个缺点,我认为他们在各种形式中都承认了这一点,是它们没有真正考虑到缓存。嗯,所以这些成本应该比你在这里看到的要低。嗯,但但根本上,是的,这些是昂贵的操作,你知道,我们可以改变,我们可以改变其中一些,但可能会以更高的错误率为代价,对吧?就像我们可以尝试缓存更多,让你继承正在进行的线程,它会更快,对吧?因为你已经加载了所有东西。它会是,你知道,可能你不会重新加载任何上下文,所以,你知道,你花费的代币可能更少,而你的错误率可能更高,而这,你知道,是我们正在权衡的事情。你的模型是否依赖于某种知识库,取决于药物?呃,是的。所以,问题只是关于,你知道,知识库方面。所以,让我,让我实际上跳过去快速展示一下。所以,我提到了这些蓝图。嗯,我,我,现在就跳到实际的实现是什么样的。所以,你可以在这里看到,你知道,这个想法,对于一个 VA,对吧?我们有几个文件在这里,它们再次被导出为 Markdown。嗯,我会尝试放大,因为我知道这些很小。嗯,让我缩小一下。好的,所以这里的想法是,你知道,我拥有所有这些,你知道,呃,框架数据,对吧?定义什么是蓝图的想法,对吧?我们正在,我们正在每次定义这个,而不是在提示中,对吧?我们将其作为上下文窗口的一部分来做,部分原因是,我们确实希望它非常灵活。如果你想改变术语,你应该能够做到,对吧?我们不希望治疗受到我们用于其他治疗的术语的束缚。我定义锚点。我谈论时间表。我谈论计划好的消息,对吧?所以,所有这些东西都存在,部分是为了奠定基础。然后这个框架,对吧?现在正在引用特定的文件,对吧?所以,你可以在这里看到,就像我再次,这些文件都相互引用。所以,我可以在这里浏览,我可以看看,你知道,点击这些链接,直接去其他地方,如果你想做一些关于知识库的事情。所以,我们做到这一点的方式是这种分诊的想法。嗯,所以,你知道,如果发生蓝图没有解决的事情,对吧?所以,我们分诊的方式是首先检查蓝图。如果你有批准的语言,就使用它,对吧?发送它,发送它进行人工审查,无论你需要做什么,对吧?但使用批准的语言。如果你认为你无法回答这个问题,你就去看看这个,你知道,再次,它是自我引用的。我们不会一次性阅读所有医学批准的知识范围。我们让 LM 决定他们是在抱怨胃痛还是出血,对吧?你知道,如果我找不到任何一个,我有一个更大的知识库,对吧?你知道,就像一个随机问题列表,人们会问。嗯,我们选择这样做,部分原因是因为它是人类可读的。它反映了客户已经拥有的东西,对吧?他们已经有很多这些结构了。嗯,而且,你知道,我们根本不认为过度处理,你知道,像 rag 这样的东西是有意义的。现在,我会说,对于我们拥有的东西,就像一种备份,你知道,一种知识存储,它几乎完全是一个 CSV,可能适合 rag,对吧?使用 rag 来做这件事是可以的,它并没有被大量使用,对吧?所以,在某种意义上,它不值得以这种方式实现,至少目前还没有。好的,嗯,是的,是的,那是提示级别。所以,我们,虚拟 OA 和评估者都有相对较小的提示,我可以展示。所以,让我看看我是否能在这里找到它们。嗯,这些提示,它们确实相互引用,对吧?所以,想象一下,你知道,再次,建立在 line chain 的东西之上。所以,基础代理类,这个提示基本上知道另一个代理,对吧?所以,在这种情况下,只有两个。所以,提示确实会相互提及。评估者知道虚拟 OA,反之亦然,对吧?你知道,我们试图做的事情,你知道,我认为这是对那些真正玩过这些东西的人来说正常的提示工程。你必须告诉它如何轮流。你必须告诉它,你知道,如果它被调用,它必须说话,对吧?就像,你知道,我们遇到的一个问题,我们必须经常重试的是 LM 认为一切都完成了。它什么也没说,整个事情就死了。嗯,所以,你知道,你必须说话,但然后你可以完成,对吧?你只需要说点什么。嗯,我们有基本想法,你必须确定这个整体置信度分数,但我们不将其包含在提示中,因为我们也想向虚拟 OA 展示它,对吧?所以,如何评分的细节被分开了,但这个概念,你是谁,这个家伙是谁,你们如何合作,这都在提示中。好的,实际上,说到这里,让我跳过去,实际上向你展示一些置信度方面的东西和指南。嗯,我将从置信度开始,然后进入指南,它们要长得多。这再次,你知道,主要是为了让 LLM 可读。这不是客户通常维护的东西,对吧?所以,它不属于这些蓝图的范畴。但这里的想法是,你知道,我有了这个置信度分数,你知道,我试图在多个维度上弄清楚。我是否知道发生了什么?你知道,这里有一些例子。我们试图尽可能具体地提供这些不同情况的例子。你知道,我是否知道我需要知道的知识?这里有一个例子,可能实际上回答了你的问题,你知道,我们是否希望 LM 使用它的世界知识来弄清楚,当我谈论一种抗生素,并且我给出了一个特定的抗生素时,它适用于整个类别。是的,这是我们愿意承担的风险,对吧?我们不需要明确说明这种特定的抗生素对这种治疗是安全的,对吧?这会很快失控。所以,我们确实有一些地方要求它。使用你自己的判断,但参考,你知道,知识库和蓝图作为你的基础。嗯,然后,在我通过这些类别之后,我就会有这个推论的想法,对吧?而这里的推论,嗯,是专门的事情,你知道,你应该从整体分数中扣除,而不是单个消息,对吧?因为单个消息可能就像,是的,这完全来自蓝图,就像它是正确的话,但总体而言,这些情况可能很复杂,对吧?所以,我们试图解释这一点,以便它能够再次对整个互动进行评分,以便将其呈现给人类审查。嗯,好的,我将继续讨论指南,因为这里的内容确实很多。嗯,这足够长,我不会回顾所有内容,但我会尝试介绍一些最大的部分。再次,有些东西非常简单,对吧?就像工具调用。嗯,我们一直遇到的一个问题是,你知道,捏造和,你知道,老实说,像这样的指令确实有帮助。嗯,你知道,不要编造工具调用。等待,等待你的回合,对吧?调用工具然后退后。嗯,有很多关于时间的事情,对吧?有很多关于,嘿,你需要以正确的方式询问它。你不能以强迫某人告诉你他们在哪里的方式来询问。对吧?人们对此非常敏感。他们不希望,你知道,人们知道他们实际在哪里,但你需要知道他们是什么时间,以便你可以为他们安排消息,对吧?嗯,你想要,你知道,当你处理时间时,嗯,你必须使用像,你知道,ISO 时间戳,就像系统的其余部分就是这样工作的。嗯,但计算这些东西并保持它们全部正确,需要一个相对智能的模型。所以,很多这些,你知道,已经随着时间的推移而发展,只是为了适应这个想法,你知道,你可以这样与模型交谈,并且做得相当好,设置锚点,安排消息。再次,这些都是系统的核心部分。这不是治疗特定的,对吧?所有这些都是为了足够通用,以至于我不需要每次添加新药时都重写它,对吧?这是核心要求之一,对吧?我们不想在代码中这样做。是的。所以,这是一个非常大的文件。是的。你是否尝试过缓存,因为这不会改变?是的,正确。不,我们有。所以,现在,我马上就会说到缓存,我只是在管理时间,但我确实有时间。就像我们正在做一些显式的系统提示缓存,然后我们正在显式地缓存,你知道,消息的多个回合,这样你知道,每个操作都是,我认为平均操作,只有一些基础的东西,每回合大约 10 到 15,000 个 token,全部缓存起来,累加起来,你知道,你可能平均生成单个消息的成本在 15 到 20 美分之间,它并不便宜,但我们正在尽可能积极地缓存。我们已经考虑过所有这些都是全新的,你知道,小时缓存的想法,你知道,克劳德刚刚引入的。我们不清楚这是否有帮助,因为,你知道,我们不能保证病人会在五分钟或一小时内回复我们,对吧?这有点像在系统级别承担风险。嗯,但如果这里有人比我更了解克劳德的缓存,请和我谈谈,因为,你知道,我们理想情况下希望缓存很多这些文件。嗯,只是不清楚我们是否可以在会话之间做到这一点。不清楚是否你知道,我们会获得我们想要的好处。所以,我们只是试图在单个对话中尽可能积极。这是一长串指南。你是怎么想出来的,又是怎么优化的?是的,我的意思是,真正的答案是,我之前提到过,你知道,有几千行代码和几千行提示。这大部分是提示,对吧?我的意思是,这是很多。嗯,这是我们随着时间的推移进行调整的事情。这是,你知道,我自己以及,你知道,医生助理,我们想出了一个我们认为基本上,你知道,相当擅长处理这些,你知道,通用情况,当我们遇到边缘情况时,我们只是修改这些提示。再次,它并不完美。我们可以考虑细分它。我们可以考虑将其移至提示中。嗯,但我们认为这种划分,你知道,大致正确,以保持通用性,这样它就可以,你知道,处理很多不同的治疗,并且它很好地处理了我们在治疗中看到的情况。对吧?你会遇到一些情况,你一天之内就完成了药物治疗。这相对不寻常,因为,你知道,这是你只需要把说明带回家的事情。嗯,你知道,但那里,我的意思是,我会展示一个关于安普的例子,你知道,那是每周每月,对吧?就像有更长的持续时间。我们试图达到平衡点,你知道,我们最终会得到一个好的结果。好的。呃,是的,后面。是的。是的。所以,问题只是关于提示长度。嗯,所以,再次,不是要轻易否定它,在克劳德的术语中,这实际上并不长,对吧?我的意思是,就像我说的,我认为平均是 15,000 个 token。嗯,它仍然留下了很多窗口,你知道,后面。它,它实际上并不那么长,直到我们开始进行多次回合,比如在一个线程中进行多次对话,我们才开始看到真正疯狂的行为,你知道,那里的东西开始爆炸了。嗯,所以,我们只是真的没有达到一个点,我们就像我的指南太长了,你知道,指南可以短一点,我认为我们已经优化了它们在各种地方,但你知道,我们已经把它塞进了一个盒子里,我们可以一次性处理一个情况,而不会真正感到任何痛苦。好的。是的。有没有关于工具的例子?你提到了工具。我不确定。是的。是的。哦,不。所以,我,我可以分享一点。所以,让我,让我在这里找到工具代码本身。所以,所以有一点需要注意,这是一个混合体,我认为我之前也提到了,你知道,有些东西来自 MCP 网关,对吧?所以,在这种情况下,你知道,我从文件中加载。它只是文件系统 MCP。再次,所有这些都限制在我们的 VPC 中。所以,那里没有什么疯狂的事情发生。嗯,但我也可以从,你知道,我的数据库加载,对吧?我可以选择让那里成为我们互动的地方。还有很多其他工具,对吧?所以,你知道,这实际上是我应用程序中大部分代码所在的地方。嗯,工具列表基本上在这里。你可以看到它是那些能够与状态交互的东西,对吧?所以,所有这些函数都在查看锚点、消息、置信度和治疗以及患者数据,所有这些东西都位于我的图运行的本地。我没有 MCP。我可以,我只是选择不。嗯,而且,你知道,在这种情况下,就像这段代码就住在这个 Python 应用程序中。你可以,你绝对可以重构它。就像状态仍然可以保留在这里,代码可以放在别处。它,你知道,这取决于你。嗯,但有一点需要注意,关于所有这些东西,我正在尝试找到一个好的例子。所以,我正在积极使用命令对象。嗯,对于任何使用 Langraph 编程的人来说,这个想法是,在任何给定点,你都可以传递回一条消息,而这个特定的东西只是一个错误消息,但就像,你知道,你可以传递回一条消息和一个去处,对吧?所以,你可以说这是响应,顺便说一句,我知道评估者要求这个,所以回到评估者。你实际上可以通过这种方式绕过一些图路由。嗯,所以,我们确实,你知道,尝试将这个融入到我们的 MCP 工具和状态工具中。是的。是的。呃,所以问题是关于我们如何改进提示。所以,嗯,它实际上是融合了,你知道,我们能够从基本上是医生助理那里获得,她拥有最多的经验,你知道,处理棘手的,对吧?是想出棘手的局面,对吧?所以,我们能够真正地通过她来测试很多边缘情况,你知道,让她假装是病人。然后我们扩大到整个运营团队,你知道,然后以更高的水平来尝试欺骗它,对吧?而且,你知道,他们把从病人那里看到的东西放出来,你知道,试图,你知道,达到这些复杂的情况。嗯,然后,你知道,与真人打交道,你知道,我们可以更进一步。嗯,但与前两个级别相比,我们没有看到,你知道,大量意想不到的东西。再次,这个系统存在。如果我们从头开始做这件事,我认为我们会很难想出我们认为的边缘是什么。而,你知道,这是一个已经存在的系统。有很多对话可以借鉴。我们可以运行其中一些。所以,我们会看看旧系统中的对话,并在那里重放它们,并基本上只是尝试找出,你知道,边缘在哪里。是否存在状态。当然。所以,问题是关于决定什么进入状态,什么不进入状态?嗯,我的意思是,我想简短的回答是,所有进入初始负载的东西,我稍后会再讲一遍。嗯,所有这些东西,我认为这个可能是一个更好的例子。是的。所以,这里的所有这些东西,这都是状态。嗯,真的没有区别,就像所有进入预加载对话的东西都是状态,有些是可编辑的,有些不是。我正在尝试回忆例子,比如这里的例子,你不能改变来源,我不能说,你知道,在 LM 操作的上下文中,这不再是 ail 病人了,对吧?LM 不允许这样做。它也不能改变过去的邮件,所以 LM 不允许查看消息队列并说三天前发出的消息五不再存在,就像那个功能不存在一样。嗯,所以我们已经校准到,它唯一能做的就是读取整个状态,修改患者数据,修改消息,修改锚点,就像未发送的消息一样。所以,你知道,这只是一个软件选择,就像我们那样架构的。如果你有一个窗口会话,可以总结一下。是的。是的。当然。我的意思是,我认为,我认为真正的答案是,这对我们来说还没有发生。就像我们构建它的方式一样。没有一个单一的思考操作会持续足够长的时间而导致问题。嗯,但但我会很快谈谈重试。所以,我们确实有这个概念,我只是把它弹出来,也许只是一个更容易看到它的方式。嗯,所以我们确实有这个概念,在图内,你知道,再次,虚拟 OA 与评估者交谈,你知道,在某个点上,每个人都使用工具,但然后有一些情况会导致图重试某个操作,对吧?其中一个就是,其中一个代理错误地调用了工具,它试图调用工具,但使用了错误的 JSON,你知道,否则事情就会崩溃。我们可以检测到这一点,我们删除消息,然后说你搞砸了那个工具调用,再试一次,对吧?这,你知道,让它留在图内,对吧?基本上,这个重试节点能够通过那个命令消息循环回来。它没有显示在这里的图上,但通过那个命令对象。它可以说回到虚拟 OA,再试一次,对吧?我们也有一些情况,你知道,我们期望模型说话,但它没有,对吧?有很多情况,克劳德只是过早地结束了它的回合。我们检测到这一点。我们说你必须说点什么,对吧?就像,字面意思,那条消息是,不要什么都不说。即使,如果你要结束你的回合,就说我完成了,对吧?这就足够了,你知道,让我们继续逻辑。所以,就是这些。评估者的低置信度将触发。抱歉,再说一遍。评估者来的低置信度。不,不。所以,低置信度是我们想传递给人类的东西,对吧?所以,低置信度是图的一个有效响应,对吧?你知道,我有一条低置信度的消息,我希望人类审查。没问题。呃,是的,构建你的系统提示。它很长。它很复杂。它不是系统提示。不,不,那是那个。那就是为什么我们把它分开。所以,是的,指南随着时间的推移而扩展。是的。好的。是的。你怎么确保你不?完美的时机来谈论评估。所以,我们快到最后了。嗯,让我稍微谈谈评估,只是为了让你对我们在这里做的事情有一个概念。所以,嗯,这是一个奇怪的,因为如果你去 Langmith,我只是,我不确定我能否找到确切的位置,但它在哪里?它是在数据集下吗?我不记得了。有一个地方,你基本上可以说,我想运行,你知道,一个评估,针对,你知道,这些,你知道,这个我在 lang 中定义的数据集。嗯,我确实在 lang 中定义了数据集。所以,我可以在这里看到,假设它加载了,希望如此。所以,我有一个我在 lang 中定义了的快乐路径数据集。我,这不是全部。再次,有些被删减了,但如果我看看这些东西,我实际上在做的是,我说,好的,这是我们过去的一次互动。嗯,你知道,这是我上周运行的一个。嗯,你知道,这里是,你知道,输入,对吧?这是病人的最后一条消息。这次对话,你知道,我有一个初始状态在这里,我可以看看,对吧?所以,我可以看看,你知道,最初发生了什么。嗯,我看到这次对话,你知道,我到达了结尾,我得到了一条消息,说,太好了,你准备好开始。好的,所以这是我的快乐路径数据集的一部分。我运行的评估,基本上是一个自定义的马具。我会稍微放大一下,希望大多数人都能看到。嗯,但再次,这里的想法是,我们不能简单地说,你知道,当我问,你知道,旧金山的天气是什么时,它给了我,你知道,冷和,你知道,多雾。它必须是,这里有一些输入状态的例子,然后,你知道,让我们评估一下,你知道,一种 LLM 作为法官的形式,输出状态是什么样的,但有一个警告,我们想要测试的一个大问题是时间操作。所以,我不能从三周前放入一个评估,现在运行它并获得相同的时间。我必须要么给它非常具体的关于如何处理时间的指导,要么替换所有时间戳。嗯,我们最终采取了两者兼有的混合方式。嗯,所以,我的评估套件是一个自定义的 Python 应用程序,附加了一个 bash 脚本。这都是客户编写的。嗯,我得到了我想要的,但我不能保证更多。嗯,我从 Langmith 加载数据集,我基本上调用医疗代理,通过,在这种情况下,我正在本地运行,就像我可以运行我的云 Lang graph 实例一样,但我实际上是在我的笔记本电脑上运行 Lang graph,使用 Langsmith 的数据集,预处理了很多关于日期、时间、你知道,情况的事情,这样当我得到结果时,我不会让 LLM 作为法官混淆它是否正确。嗯,我正在使用这个 LLM 评分表,对吧?所以,让我看看我是否能找到我的评分表。所以,好吧,这里有一些例子。所以,我有一个 YAML 文件。所以,这只是,这是 prompt fu 以及它的工作原理。嗯,我所做的是,我基本上说,看,我正在测试,你知道,这个我将要调用的自定义东西,你知道,基本上与我的,嗯,你知道,我的自定义马具,然后我希望你评估它,你知道,使用 LLM,在这种情况下,我认为它正在使用 GPT40。嗯,你知道,这个评估标准基本上是,一切都基本相同吗?我看到微小的差异,但我不认为它们是大问题。我的意思是,我们保持得很模糊。我们真正想知道的是,有没有什么东西完全坏了,对吧?然后有一些情况是这样的。嗯,我不得不在这里放一些具体的笔记,比如,嘿,不要挑剔,比如,你知道,你在像锚点这样的东西中看到的不同的措辞,有时它会说他们会服药,它说他们服了药,就像谁在乎,在这种情况下,精神是正确的。嗯,所以,你知道,然后是时间和日期,有一些具体的语言。所以,所有这些都变成了基本上是这个家伙,对吧?所以,嗯,当我看到这个,再次,我知道这里有很多文字。嗯,不值得看全部。我运行了我的数据集中的这三个例子,我得到了,基本上是一个及格分数,对吧?我稍后会看一个失败的,一个通过的,但在每种情况下,对吧?我可以看到 LLM 作为法官说了什么,对吧?所以,如果我在这里向下看,这是 GPT40 在评论,嗯,这是你给我的源数据,样本输出。这是我刚刚运行的结果。足够接近了,对吧?嗯,你知道,它确实指出了几件事,对吧?所以,如果我运行了这些评估,我就会想,嗯,提醒消息没有出现,这实际上是一个大问题。我本可以选择这样做,我可以加强我的评分表,但我们这样做的方式只是说,在任何给定点,我们确实需要能够测试系统的当前状态。我们想针对,你知道,首先是快乐路径,然后我们当然可以针对边缘情况。我们正在积极维护它,我认为一旦我们将其更全面地移交给客户,这可能会改变,对吧?我们希望他们拥有他们可能需要的所有保护。但它是这种风格,你知道,这种风格的电子邮件。这回答了你的问题吗?或多或少。好的。好的。嗯,是的。请继续。是的。所以,我的意思是,简短的回答是肯定的。其中一些我出于几个原因进行了编辑,但是的,或多或少,我们从快乐路径开始。我们确实有一些特定的,比如,嘿,这个坏了,而且经常坏了,让我们确保它没有,你知道,但这只是一个不同的数据集。是的。呃,是的。嗯,所以,再次,我在这里展示的部分完全是 Python,在一个 line graph 容器中。嗯,我猜,它大概有 4000 行代码。嗯,大部分老实说都是工具调用,就像我肯定也可以重构得更短。嗯,不多。它真的只是足够运行这个图,对吧?你知道,我必须有它们之间的路由。我必须有它可以调用的工具。嗯,其他所有东西都在提示和指南中,对吧?所以,你知道,它真的更多的是英语而不是代码。在另一边,对吧?在盒子的另一边,对吧?这个东西,那个蓝色的盒子,我不知道确切的代码量,但它完全是 Node 和 React 和 Um 和 Um,坦白说,我没有太参与其中。抱歉。是的。我也是行业。是的。你怎么看待这个问题?是的。是的。一个很好的问题。所以,关于规模的问题。所以,让我实际上跳过去展示一些我可能早就应该展示的东西,但我忘了。我之前提到了我们做不同治疗的想法。所以,嗯,我在这 particular 的情况下做的,所以,你知道,再次,我们专注于早期妊娠丢失。嗯,我实际上,我认为我在这里放着。所以,让我缩小范围找到它,然后我再放大。所以,我把这个带给了 Klein,我基本上对 Klein 说,“嘿,我有了,是的,这应该是它。”嗯,我说,“我想做一个新的治疗,对吧?我为 Aila 定义了一个。这是结构,对吧?看看。嗯,这是链接到,你知道,诺和诺德的关于如何给奥赛匹克剂量建议。嗯,给我做点新的,对吧?嗯,它基本上经历了整个过程,我会缩小它。嗯,并创建了,你知道,一个基本的治疗,你知道,对于奥赛匹克。它读取了这些文件。然后它决定,好吧,我明白了。这是我要做的事情。嗯,我只是说,好的,去吧。这是基于你说的东西的一些调整。所以,我,再次,这是我的客户流程。我一直使用它。嗯,我得到了我认为相当有用的治疗,我很快就会在这里向你展示。如果我回到这些对话,我很确定我给这些人起的名字都是 O。所以,你看,这是奥利弗和奥赛匹克。嗯,你可以看到它仍然是 Ava。我没有改变那个,对吧?我,我,你显然可以达到让它成为不同个性的程度,但在这个例子中,这是 Ava,她有一个新的治疗方法,询问所有关于 Ozmpic 注射笔的事情,并帮助我弄清楚他们的时间。和我们之前一样。每周注射一次。我没有为这个改变任何代码。我只是把它通过 Klein 得到了新的治疗方案,它就起作用了。是的。是的。在你的图表中,它是为了捕捉重试节点。问题是,它是为了捕捉那些围绕错误地调用工具的错误,这是图表终止的一个简单方法。对吧?所以,如果它,你知道,忘记了一个括号,然后,你知道,发送了无效的 JSON。嗯,克劳德现在很少这样做了。就像 Sonnet 4 相当不错,但 Sonnet 3.5 远没有那么好。所以,我们可以检测到这一点,然后我们可以说,好吧,你正在尝试调用工具,因为我在这里看到了一些东西。我看到工具调用 ID 作为参数。我看到奇怪的括号,你知道,我们可以在代码中解析它。嗯,然后再次,我们删除这条消息,然后回到调用它的人说,“嘿,你搞砸了,请原谅我的法语。”嗯,再试一次。所以,这个想法,你知道,重试节点,有几种情况,我们不会以确定性的方式接管并完成它。我们只是告诉 LM,你犯了一个错误。这是你错误的性质。再试一次。而且我们确实必须擦除它对这个错误的记忆,因为它会变得非常困惑。就像,在我们早期测试中,这种情况经常发生,它会错误地调用工具,然后凭空捏造结果,对吧?所以,如果你保留这条消息,它会认为它理解了蓝图,即使它编造了整个蓝图,对吧?所以,我不想粉饰太平,因为有一些奇怪的情况,如果你不非常小心地控制它,你可能会遇到一些非常糟糕的行为。但我们能够捕捉到主要的,并基本上再给它一次机会。我正在寻找一个循环。哦,好吧。抱歉。没有循环的原因是,这完全是,这实际上是我认为 Langmith 和 Lang graph 可以做得更好的地方。重试节点能够使用命令对象调用其他节点,但它没有显示在图上。所以,事实证明,他们非常投入,Langmith 或 Lang graph 在图流方面,然后他们引入了这个想法,好吧,你甚至不必在图表中定义它,你可以发送任何东西到任何地方,这就是我们正在使用的。是的。是的。不,当然。但请记住,抱歉,问题是关于置信度评分以及我们如何让它变得更高。嗯,我们希望分数更低,当情况复杂时,不是因为我们认为它是错误的,而是因为我们希望人类审查它。嗯,好吧,所以,抱歉,你是什么意思?正确。是的。所以,如果置信度分数高于阈值,意味着高于它,对吧?所以,假设我的置信度分数是 0.9。这可能意味着,对吧?我一次发送多条消息,但没有其他理由让我认为这些消息是错误的。嗯,我们选择与客户一起将阈值设置得更低,因为他们不希望他们的工作人员每次遇到一点复杂情况时都必须介入。但我们同意,如果低于 0.75,他们应该。这纯粹是校准,对吧?你决定是否希望你的工作人员每次都参与其中,将置信度分数设置为 100,对吧?你可以看到发生的一切。你整天都在点击批准。你是乔治·杰特森。但,你知道,这希望不是人们真正想要的,对吧?你想要很多这些东西,如果它们是高置信度的,你知道,基本上是可恢复的,让我们这么说。就像,你知道,可能有一些情况,你不想自动发送消息。希望我们可以控制这一点。但总的来说,就像我们希望将其设置在一个感觉我们能够从人类那里获得规模的地方,对吧?这意味着自动发送消息,对吧?呃,是的。是的。试图评估。是的。是的。所以,问题是关于置信度评分和复杂性的混淆。是的。100% 同意。而且,再次,我认为我们现在对它的运作方式感到满意,但我不敢肯定我们做得对置信度部分。嗯,同时,就像它的概念我认为是好的,对吧?你知道,你是否拥有你需要的信息?你知道,有没有什么,你知道,你是否理解用户的意图,或者,你知道,他们说了什么含糊不清的话?而且我们确实看到了触发它的情况,对吧?并不是说我们从未看到它,你知道,正确地评价自己就像,嗯,我不太确定他们说了什么,但它不像我们希望的那么频繁。所以,我们将其与复杂性结合起来,部分原因是因为,你知道,我们只是想让它低于阈值,以便我们可以让人类审查它。它不是一个完美的系统,但它是一个我们认为有效的系统。所以,更多的是置信度。正确。呃,正确。所以,关于这一点,它不是特定响应是精确和完美的,等等,它的置信度,我们认为没有不确定性的混合,你知道,关于响应是什么,以及复杂性。

情况,对吧?这两件事中的任何一件都可能将其推到阈值以下。你们是如何托管的?嗯,所以这一切都是关于托管的问题。所以,Langraph 有一个预先构建的容器化,你可以使用。我们正在使用它,并做了一些修改。嗯,我们基本上是用 Terraform 部署了它的两个部分,对吧?所以回到这里,我们用 Terraform 部署了它的两个部分。你知道一切都通过 GitHub Actions 连接起来。我的意思是,你知道,我们尽可能地自动化。但我们正在使用大部分内置的 Langraph 容器化。我以为有一个平台,你知道,我的意思是,我们正在与 Langchain 积极地就此进行对话。所以问题实际上是,我们需要的部署方式的具体性质。嗯,Langraph 平台目前不支持,对吧?所以,它正在不断发展,但我们已经进行了那些对话。嗯,让我暂停一下。我们还有 10 分钟。嗯,或者大约 10 分钟,九分钟。嗯,我只是想再次检查一下我想要谈论的事情清单,以确保我没有错过任何重要的事情。嗯,谈过那个,谈过那个。好的。我认为我们或多或少地涵盖了所有内容。嗯,所以我很乐意开放。嗯,我有一些最后的想法,我会放在这里,如果有人好奇的话。嗯,还有其他问题吗?是的。是的。嗯,所以问题是关于构建这些东西的资源分配。所以,我的意思是,我认为最好的说法是,我们已经构建了一些类似的东西。我们还没有为医疗保健做过,对吧?但我们能够带来一些东西,你知道,我有一个开源的 Langraph 项目,我乐于将其用作这个客户端代码的基础,对吧?再次,我们分叉了它,我们将其引入了私有领域,你知道,但这让我们走了一半的路,部分原因是因为这不是一个完全特殊的雪花,它是一个带有工具的工作流。所以,你知道,我认为每次我们这样做时,我们都花了更少的时间在最初的脚手架上。嗯,你知道,我们现在正在看另一个项目,它会更快。所以,很多时候,一旦你做了这个,并且你理解了机制,你就能达到“足够好”或者达到一个起点,这只是快了很多。嗯,虽然是这样,但你知道,再次,我们仍在努力,我们已经进行了几个月,但我认为我们可能在这么短的时间内构建了传统软件一年甚至更多的东西。还有其他吗?是的,所以你提到你做了很多编码,这可以稍微解释一下。我很好奇有多少像,嗯,好吧,所以,所以,问题是关于代码辅助和这些工具对这些框架了解多少。所以,代码辅助的最大问题,对吧?就是当你处理一些足够新,以至于模型不太理解的东西时。你总是可以给它们发送 API 文档,它们通常做得很好。嗯,我在 Langraph 中遇到了很多地方,没有人尝试过这样做,没有人遇到过这个确切的错误,我们不得不来回积极地调试它。我绝对可以肯定地说,03 比 Claude 是一个更好的调试器。所以,你知道,我们确实有过不得不这样做的案例。但总的来说,就像,我的意思是,只要你能找到文档,你知道,你就能达到一个合理的地方。而且,再次,我是一名工程师。我最终可能会称自己为一名在职工程师,但我现在可能不会。就像我没有所有相同的实践和所有相同的卫生习惯,你知道,我们的专业工程师所拥有的。但我确实知道如何识别不良行为。而且我非常擅长提示来获得我想要的东西。所以,这大概就是它的运作方式。嗯,有什么?哦,是的。请。在这个例子中,没有,有 MCP。MCP 在几个地方,对吧?所以,如果你看那里的连接,实际上有两个,其中一个我只是没有完全标记顶部的蓝图知识库,那个黄色的框,在 Langraph 上下文中,它是一个 MCP 连接,然后垂直方向上还有一组连接回数据库。所以,有几个地方会发生这种情况,但再次,它主要是为了状态的交换,以及为了这个,你知道,文档的阅读。这主要是它发生的地方。是的。是的。绝对。是的。是的。所以问题是关于快速的短信。所以,是的,我们处理它的方式是双重的。所以,一个是我们有一个可配置的,我不太确定我们是否启用了它,但我们有一个想法,在实际发送它进行处理之前有一个可配置的延迟。所以,如果有人要连续发送五条短信,我们会等五秒钟再做任何事情,对吧?这是我们可以捕获它的一种方式。但另一种方式是,如果我们有人随后发短信,我们会使之前的运行线程失效,对吧?我们不希望出现进程中的响应。我们希望获取对话的完整上下文,将所有这些发送进去,然后我们一次回复五条消息,对吧?所以,这是智能重试和智能失效的结合。是的。是的。是的。嗯,这个问题是关于恶意响应的。嗯,总的来说,我们正在提供一些非常基本的指导,你只在这里回答与治疗相关的问题。如果有人想和你谈论天气,你只需要说,“对不起,我无法提供帮助。”你知道,或者其他更糟糕的事情。所以,总的来说,这效果很好。我们已经很好地调整了升级机制,对吧?如果有人基本上失控了,你无法想出回应,你只需要说,“对不起,我会找人来帮你。”它会降低置信度,然后人类就可以介入。实际上这种情况并不多见。我的意思是,再次,如果你参与其中,就像,你知道,如果你参与其中,并且你花时间真正与系统互动,你想要结果,你可能想回到你的生活。所以,我们并没有看到很多这种情况,但这就是我们会如何处理它。在你开发过程的任何阶段,你是否感到足够沮丧?是的,我是否对 Langraph 感到足够沮丧?嗯,在任何时候,老实说,我只想说一件事,这只是一个完全的个人项目。我正在做一个副业,关于大学咨询。我只是把它放在这里,因为我有时会展示它。重点是,我进入这个项目时明确地试图避免它。我说我要做一个非常类似的事情,我有一个人工智能在工作流的中间,我想问问题,我想思考,我不想使用 Langraph 或 Crew 或任何这些其他框架,因为我不想依赖它们。所以,我问,你知道,我让 Klein 为我写了一个相当擅长,你知道,与这些模型交谈和构建思考过程的层,它做得很好。我的意思是,拥有框架的原因部分是因为,你知道,再次,我们不会永远和这个客户在一起。我们希望他们拥有可以操作的东西。我们希望他们拥有可解释且易于使用的东西,就像这些都是 Google Cloud 中的日志一样,这不是最有趣的体验。所以,你知道,这确实是明智地选择你的工具,你知道,好的和坏的,你从其他工具中获得更好的体验。说到这个,嗯,谢谢你问我这个问题。嗯,我,所以 Cursor 的 Klein。我承认 Cursor 和 Windsurf 顺便说一句也很棒。我的意思是,有几个我真的很喜欢。Cursor 和 Windsurf 作为两个例子,它们只是在试图达到这个狭窄的,你知道,关于它必须每月花费 20 美元,因此它必须经过高度优化,它如何在不同的地方发送 token,否则它们的经济就会崩溃。Klein 没有这样做。它很简单。它真的很,我的意思是,它非常智能,但它只是为智能模型提供工具,而那个智能模型可以花费它所花费的任何成本。Klein 是 Claude Code 和 Codecs 的精神表亲,对吧?我的意思是,它是那种风格,而不是一个必须达到这个非常狭窄的目标并且必须对 token 流动方式进行大量预优化的 IDE。是的。是的。所以,我的意思是,老实说,这也是另一个我举手说“这就是为什么我不是一个真正的软件工程师”的地方。我的 Python 代码没有健壮的测试框架。我真的不需要它,对吧?或者至少,就像我使用 eval 和系统的整体性能作为更好的基准,对吧?所以,eval 很重要。我们必须有那些。嗯,你知道,代码的另一边,你知道,Stride 是一个 TDD 商店,我们的软件工程师非常擅长测试驱动开发,所以蓝盒子经过了非常好的测试。但只是我的代码,你知道,非常多的是 eval 测试。这不是一个很好的答案,但这就是我对此的思考方式。好的。我认为我们到时间了。非常感谢大家。这太棒了。如果你想留下来,我会在这里。\[音乐]