ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

零基础快速构建你的LLM Agent框架,掌握AI的未来!

零基础快速构建你的LLM Agent框架,掌握AI的未来! 前言构建代理时开发者不仅需要决定使用的模型、用例和架构还必须选择合适的框架。是选择经验丰富的 LangGraph还是尝试新兴的 LlamaIndex 工作流又或者走传统路线完全手动编写代码为了简化这一决策过程我在过去几周里使用各大主流框架构建了相同的代理程序并深入分析了它们的优缺点。第一个选项是完全跳过框架完全自己构建代理。在开始这个项目时这就是我开始采用的方法。下面基于代码的代理由一个 OpenAI 驱动的路由器组成该路由器使用函数调用来选择要使用的正确技能。该技能完成后它会返回路由器以调用其他技能或响应用户。defrouter(messages):ifnotany(isinstance(message,dict)andmessage.get(role)systemformessageinmessages):system_prompt{role:system,content:SYSTEM_PROMPT}messages.append(system_prompt)responseclient.chat.completions.create(modelgpt-4o,messagesmessages,toolsskill_map.get_combined_function_description_for_openai(),)messages.append(response.choices[0].message)tool_callsresponse.choices[0].message.tool_callsiftool_calls:handle_tool_calls(tool_calls,messages)returnrouter(messages)else:returnresponse.choices[0].message.content技能本身在它们自己的类例如 GenerateSQLQuery中定义这些类共同保存在 SkillMap 中。路由器本身只与 SkillMap 交互它用于加载技能名称、描述和可调用函数。这种方法意味着向代理添加新技能就像将该技能编写为自己的类一样简单然后将其添加到 SkillMap 中的技能列表中即可。这里的想法是让添加新技能变得容易而不会干扰 router 代码。classSkillMap:def__init__(self):skills[AnalyzeData(),GenerateSQLQuery()]self.skill_map{}forskillinskills:self.skill_map[skill.get_function_name()](skill.get_function_dict(),skill.get_function_callable(),)defget_function_callable_by_name(self,skill_name)-Callable:returnself.skill_map[skill_name][1]defget_combined_function_description_for_openai(self):combined_dict[]for_,(function_dict,_)inself.skill_map.items():combined_dict.append(function_dict)returncombined_dictdefget_function_list(self):returnlist(self.skill_map.keys())defget_list_of_function_callables(self):return[skill[1]forskillinself.skill_map.values()]defget_function_description_by_name(self,skill_name):returnstr(self.skill_map[skill_name][0][function])总的来说这种方法的实现相当简单但也带来了一些挑战。基于代码的方法提供了一个很好的基线和起点提供了一种很好的方法来了解代理的工作原理而无需依赖来自主流框架的固定代理教程。尽管说服 LLM 运行可能具有挑战性但代码结构本身足够简单并且可能对某些用例有意义。LangGraph 是历史最悠久的代理框架之一于 2024 年 1 月首次发布。该框架旨在通过采用 Pregel 图形结构来解决现有管道和链的非循环性质。LangGraph 通过添加节点、边和条件边的概念来遍历图形可以更轻松地在代理中定义循环。LangGraph 构建在 LangChain 之上并使用该框架中的对象和类型。LangGraph 代理看起来与纸上基于代码的代理相似但其背后的代码却截然不同。LangGraph 在技术上仍然使用“路由器”因为它使用函数调用 OpenAI并使用响应继续新的步骤。但是程序在技能之间移动的方式完全不同。tools[generate_and_run_sql_query,data_analyzer]modelChatOpenAI(modelgpt-4o,temperature0).bind_tools(tools)defcreate_agent_graph():workflowStateGraph(MessagesState)tool_nodeToolNode(tools)workflow.add_node(agent,call_model)workflow.add_node(tools,tool_node)workflow.add_edge(START,agent)workflow.add_conditional_edges(agent,should_continue,)workflow.add_edge(tools,agent)checkpointerMemorySaver()appworkflow.compile(checkpointercheckpointer)returnapp此处定义的图形有一个用于初始 OpenAI 调用的节点上面称为“agent”还有一个用于工具处理步骤的节点称为“tools”。LangGraph 有一个名为 ToolNode 的内置对象它获取可调用工具的列表并根据 ChatMessage 响应触发它们然后再次返回到 “agent” 节点。defshould_continue(state:MessagesState):messagesstate[messages]last_messagemessages[-1]iflast_message.tool_calls:returntoolsreturnENDdefcall_model(state:MessagesState):messagesstate[messages]responsemodel.invoke(messages)return{messages:[response]}LangGraph 的主要好处之一是它易于使用。图形结构代码干净且易于访问。特别是如果您具有复杂的节点逻辑则拥有图形的单一视图可以更轻松地了解代理是如何连接在一起的。LangGraph 还使转换在 LangChain 中构建的现有应用程序变得简单明了。Workflows 是代理框架领域的新进入者于今年夏天早些时候首次亮相。与 LangGraph 一样它旨在使循环代理更易于构建。工作流还特别关注异步运行。Workflows 的一些元素似乎是对 LangGraph 的直接响应特别是它使用事件而不是边缘和条件边缘。工作流使用步骤类似于 LangGraph 中的节点来容纳逻辑并使用发出和接收的事件在步骤之间移动。下面的代码定义了 Workflow 结构。与 LangGraph 类似这是我准备状态并将技能附加到 LLM。classAgentFlow(Workflow):def__init__(self,llm,timeout300):super().__init__(timeouttimeout)self.llmllm self.memoryChatMemoryBuffer(token_limit1000).from_defaults(llmllm)self.tools[]forfuncinskill_map.get_function_list():self.tools.append(FunctionTool(skill_map.get_function_callable_by_name(func),metadataToolMetadata(namefunc,descriptionskill_map.get_function_description_by_name(func)),))stepasyncdefprepare_agent(self,ev:StartEvent)-RouterInputEvent:user_inputev.inputuser_msgChatMessage(roleuser,contentuser_input)self.memory.put(user_msg)chat_historyself.memory.get()returnRouterInputEvent(inputchat_history)设置 Workflow 后我定义了路由代码stepasyncdefrouter(self,ev:RouterInputEvent)-ToolCallEvent|StopEvent:messagesev.inputifnotany(isinstance(message,dict)andmessage.get(role)systemformessageinmessages):system_promptChatMessage(rolesystem,contentSYSTEM_PROMPT)messages.insert(0,system_prompt)withusing_prompt_template(templateSYSTEM_PROMPT,versionv0.1):responseawaitself.llm.achat_with_tools(modelgpt-4o,messagesmessages,toolsself.tools,)self.memory.put(response.message)tool_callsself.llm.get_tool_calls_from_response(response,error_on_no_tool_callFalse)iftool_calls:returnToolCallEvent(tool_callstool_calls)else:returnStopEvent(resultresponse.message.content)stepasyncdeftool_call_handler(self,ev:ToolCallEvent)-RouterInputEvent:tool_callsev.tool_callsfortool_callintool_calls:function_nametool_call.tool_name argumentstool_call.tool_kwargsifinputinarguments:arguments[prompt]arguments.pop(input)try:function_callableskill_map.get_function_callable_by_name(function_name)exceptKeyError:function_resultError: Unknown function callfunction_resultfunction_callable(arguments)messageChatMessage(roletool,contentfunction_result,additional_kwargs{tool_call_id:tool_call.tool_id},)self.memory.put(message)returnRouterInputEvent(inputself.memory.get())选择代理框架只是影响生成式 AI 系统生产结果的众多选择之一。与往常一样拥有强大的护栏和 LLM 跟踪是值得的并且在新的代理框架、研究和模型颠覆现有技术时保持敏捷。最后的最后感谢你们的阅读和喜欢我收藏了很多技术干货可以共享给喜欢我文章的朋友们如果你肯花时间沉下心去学习它们一定能帮到你。因为这个行业不同于其他行业知识体系实在是过于庞大知识更新也非常快。作为一个普通人无法全部学完所以我们在提升技术的时候首先需要明确一个目标然后制定好完整的计划同时找到好的学习方法这样才能更快的提升自己。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】大模型知识脑图为了成为更好的 AI大模型 开发者这里为大家提供了总的路线图。它的用处就在于你可以按照上面的知识点去找对应的学习资源保证自己学得较为全面。经典书籍阅读阅读AI大模型经典书籍可以帮助读者提高技术水平开拓视野掌握核心技术提高解决问题的能力同时也可以借鉴他人的经验。对于想要深入学习AI大模型开发的读者来说阅读经典书籍是非常有必要的。实战案例光学理论是没用的要学会跟着一起敲要动手实操才能将自己的所学运用到实际当中去这时候可以搞点实战案例来学习。面试资料我们学习AI大模型必然是想找到高薪的工作下面这些面试题都是总结当前最新、最热、最高频的面试题并且每道题都有详细的答案面试前刷完这套面试题资料小小offer不在话下640套AI大模型报告合集这套包含640份报告的合集涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师还是对AI大模型感兴趣的爱好者这套报告合集都将为您提供宝贵的信息和启示。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】
返回列表