maf

Artech6 天前
ai·agent·maf·aicontextprovider·chathistorymemoryprovider·mem0provider
[MAF预定义的AIContextProvider-04]Mem0Provider——长期记忆基于的云端解决方案在ChatHistoryMemoryProvider——赋予Agent从经验中学习的能力中,我们介绍了如何利用ChatHistoryMemoryProvider赋予Agent长期的记忆,使之具备从过去经验学习进化的能力。ChatHistoryMemoryProvider利用我们提供的向量数据库,对每次调用产生的消息针对指定的Scope维度进行存储,并将当前消息作为查询文本,结合设定的Scope维度检索历史消息作为上下文的一部分来参与LLM的推理。除了这种需要我们们自己搭建和维护的基于向量数据库的解决方案之
Artech8 天前
ai·c#·agent·memory·maf
[MAF预定义的AIContextProvider-03]ChatHistoryMemoryProvider——赋予Agent从经验中学习的能力LLM具有固化的知识,而且针对LLM的调用是完全无状态,永远只做一锤子买卖。但是交给Agent的任务基本上不可能一蹴而就,而且还希望Agent具有学习进化的能力。所以你会发现,很多的Harness手段的目的就是为了弥合两者之间的鸿沟。解决这个问题的基本的前提是:需要赋予Agent记忆。短期记忆赋予Agent在同一个语境下进行多轮对话的能力,对于MAF来说,就是Session。长期记忆实现了跨Session的信息共享,其共享范围可以针对用户(比如了解用户的偏好)、针对Agent(比如了解Agent的能力和经
Artech10 天前
ai·c#·agent·agent skills·maf
[MAF预定义的AIContextProvider-02]AgentSkillsProvider——将Agent Skills引入MAFSkills针对Agent的重要性是不言而喻的。从本质上讲,Agent Skills就是随着用户与LLM对话的推进,动态加载被称为Skill作为提示词的一种机制。在大部分实现中,Skill的内容会被封装成角色为Tool的消息被添加到对话历史中,因为这样可以借助针对对话历史的压缩实现对老旧Skill的卸载。Agent Skills依然是输入增强的一种形式,所以Agent Skills在MAF中是被AgentSkillsProvider的AIContextProvider引入的。
Artech11 天前
ai·agent·rag·maf
[MAF预定义的AIContextProvider-01]TextSearchProvider——RAG在MAF中的实现作为最核心的AIAgent,ChatClientAgent构建了一个管道与LLM交互。为了让管道的输出更符合我们的需求,有两个主要的途径:输入增强(Input Enhancement)和输出增强(Output Enhancement),前者通过通过改变输入让LLM返回更高质量的内容,后者则直接对LLM的输出进行加工处理。个注册的AIContextProvider组成的管道位于ChatClientAgent管道的中间件部分(前后分别是AIAgent中间件管道和ChatClient管道),是专门为输入和输出增
Artech13 天前
ai·agent·maf·messageinjectingchatclient
[MAF预定义ChatClient中间件-09]MessageInjectingChatClient-赋予工具消息注入的能力MAF中的ReAct循环是由FunctionInvokingChatClient中间件完成的,这意味着AIFunction的调用也是由它驱动。在默认的情况下,AIFunction绑定的委托执行完成后,结果会转换成AIContent并被封装成一个角色为Tool的ChatMessage。这个ChatMessage最终被添加到对话历史中,并作为后续调用LLM的输入。换言之,AIFunction不像LangChain的工具函数一样,可以通过返回Command对象添加具有合法结构的消息列表到对话历史中。当工具在执行
JaydenAI13 天前
python·ai·langchain·c#·agent·hitl·maf
[对比学习LangChain和MAF-07]如何引入人机交互的审批流程如何执行的工具涉及一些较为敏感的操作,必需要经过人工审批才能执行,这时候就需要引入人机交互(Human-In-The-Loop)的机制。无论是LangChain还是MAF,都提供了相应的机制来支持人机交互,下面我们来看看它们是如何实现的。
Artech16 天前
ai·agent·open telemetry·maf
[MAF预定义ChatClient中间件-08]OpenTelemetryChatClient-实现链路跟踪和性能监控赋予部署的应用和服务可观测性已经是一个基本的需求,在这方面,OpenTelemetry无疑已经称为了事实上的标准。OpenTelemetryChatClient是一个预定义的IChatClient中间件,它利用重写的GetResponseAsync和GetResponseStreamAsync方法,为LLM的调用添加了对于的链路和性能计数的输出。结合OpenTelemetry框架,开发者可以轻松地将这些数据发送到各种后端系统,如Prometheus、Jaeger等,以实现对LLM调用的深入分析和监控。本篇
JaydenAI17 天前
ai·c#·agent·maf·agent中间件
[MAF预定义Agent中间件-05]ToolApprovalAgent-摆脱重复审批的烦恼涉及敏感操作的工具执行都需要引入基于人机交互(HITL, Human-In-The-Loop)的审批机制来确保安全。按照安全级别由高到低,我们可以采用如下三种常见的审批模式:
JaydenAI18 天前
ai·c#·agent·aop·maf
[MAF预定义Agent中间件-03]FunctionInvocationDelegatingAgent:将AOP引入函数调用工具让Agent具备了与外界交互的能力。按照工具的执行,MAF的工具可以划分为服务端或者承载端工具和客户端工具两大类。前者在承载LLM的服务器端执行,以Hosted前缀命名的工具(比如HostedCodeInterceptorTool、HostedWebSearchTool和HostedImageGenerationTool)基本属于这一类;后者是在客户端(Agent端)定义的函数,通过AIFunction来表示。大部分Agent都会涉及AIFunction,通过一种调用拦截机制将AOP引入函数调用是很有
Artech18 天前
ai·agent·maf
[MAF预定义ChatClient中间件-06]利用ImageGeneratingChatClient开发专业图片生成Agent我们目前已经有相当专业的图片生成的模型,它可以利用我们提供的文本提示来生成高质量的图片,但是由于我们对文字的驾驭能力不够,写不出迎合LLM的提示词。ImageGeneratingChatClient中间件结合我们注册的ImageGenerator将两者结合在一起:我们通过与Agent对话的方式说出我们对生成图片的描述,LLM根据我们的描述返回专业的提示词文本。注册的ImageGenerator将提示词提交给专门负责图片生成的模型来生成图片。
Artech19 天前
ai·agent·maf·agent管道
[MAF预定义ChatClient中间件-05]动态修改ChatOptions和请求消息调用IChatClient的GetResponseAsync或者GetStreamingResponseAsync方法时,我们通常会传入一个ChatOptions对象来控制运行行为。当我们基于IChatClient构建一个ChatClientAgent对象时,可以指定对应的ChatClientAgentOptions。ChatClientAgentOptions携带的ChatOptions会每次应用到针对IChatClient的调用中去,所以这是绑定公共ChatOptions的一个好方式。如果某些调用需要
Artech20 天前
ai·agent·maf·reducingchatclient
[MAF预定义ChatClient中间件-04]ReducingChatClient——通过精减对话实施又不丢失基本语义绝大部分的Agent都采用对话的方式来和用户进行交互,所以对话的内容就成了Agent决策的基础,对话历史也成为占据LLM上下文窗口的主要内容。LLM推理的质量并非与上下文的丰富程度成正向关系,有时候过多的上下文信息反而会干扰Agent的判断,导致它做出错误的决策。ReducingChatClient就是为了解决这个问题而设计的一个中间件,它通过精减对话内容来帮助Agent更好地理解用户的意图,从而做出更准确的决策。为上下文窗口腾出更多空间也是保证可靠性的一种基本的手段。
JaydenAI21 天前
ai·c#·agent·maf·agent管道·agent中中间件
[MAF预定义Agent中间件-01]LoggingAgent——在Agent调用前后输出日志ChatClientAgent管道由三部分组成,面向LLM的ChatClient管道中预定义了一个LoggingChatClient中间件,Agent中间件管道中预定义了一个LoggingAgent中间件,除了所处位置决定的调用时机不同外,它们的设计和实现方法几乎一摸一样。所以我们以LoggingChatClient——在LLM调用前后输出日志这篇文章一样的结构来介绍LoggingAgent中间件。该中间件它在调用Agent前后输出日志,帮助我们更好地了解Agent的执行过程。它会记录每次调用的输入和输出
JaydenAI21 天前
ai·c#·agent·maf
[MAF预定义的AIContextProvider-10]TodoProvider——用TodoList驱动Agent的任务执行当LLM需要执行一个包含多个步骤的复杂任务时,随着对话轮次的增加,提示词会变得极长,LLM极易发生注意力涣散,导致漏掉某些步骤或重复执行已完成的步骤。解决的方法也很简单,就是创建一个TodoList,把每一步都列出来,LLM每完成一步,就在对应的代办事项上做个标记,这样就能时刻提醒LLM当前的进度和剩余的步骤了。作为LangChain的Harness框架的Deep Agents提供了一个TodoListModdleware来实现这个功能,MAF中与之对应的则是TodoProvider。
JaydenAI23 天前
ai·c#·agent·agent skills·maf
[MAF预定义的AIContextProvider-02]AgentSkillsProvider——将Agent Skills引入MAFSkills针对Agent的重要性是不言而喻的。从本质上讲,Agent Skills就是随着用户与LLM对话的推进,动态加载被称为Skill作为提示词的一种机制。在大部分实现中,Skill的内容会被封装成角色为Tool的消息被添加到对话历史中,因为这样可以借助针对对话历史的压缩实现对老旧Skill的卸载。Agent Skills依然是输入增强的一种形式,所以Agent Skills在MAF中是被AgentSkillsProvider的AIContextProvider引入的。
Artech23 天前
ai·agent·maf·agent管道·ichatclient
[MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间我们知道LLM的调用不仅仅是一个耗时的操作,还会产生一定的费用,所以我们希望能够尽可能地减少不必要的调用。CachingChatClient就是为此而生的一个中间件实现,它通过在内存中维护一个缓存来存储之前调用LLM的输入和输出,从而避免了对相同输入的重复调用。当我们调用GetResponseAsync方法时,CachingChatClient会先检查缓存中是否已经存在针对相同输入的响应,如果存在就直接返回缓存中的响应,而不需要再次调用LLM;如果不存在,那么它就会调用LLM来获取响应,并将输入和响应一起
Artech24 天前
ai·agent·react·maf·ichatclient
[MAF预定义ChatClient中间件-02]FunctionInvokingChatClient——实现ReAct循环和人机交互的大功臣在众多预定义的IChatClient中间件中,FunctionInvokingChatClient无疑是最重要的一个,以至于没有它整个Agent就无法工作了。原因在于驱动Agent执行的核心机制的ReAct循环就是通过FunctionInvokingChatClient实现的,我们注册的工具函数最终由它来调用。对于相对敏感的工具函数,我们还需要通过人机交互引入审批流程,这也是通过FunctionInvokingChatClient来实现的。