ARTICLE DETAIL

资讯详情

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

入门agent,一些必要的基础python代码结构你要会看懂

入门agent,一些必要的基础python代码结构你要会看懂 前置最近公司在做简单的agent智能体研发其中当然少不了工作流中代码组件因为里面使用的是python语言所以自己总结了一些必须看懂的代码结构方便砸门入门agent如果有java基础可以看看这个PythonJava 里最像作用listArrayList存一组有顺序的数据dictHashMapkey → valuetuple没有完全对应类似不可变的List一组不能修改的数据setHashSet存不重复的数据strString字符串intint / Integer整数Nonenull没有值1.dict—— Agent 开发最重要的数据结构这个一定要熟。state { user_input: 帮我查一下北京天气, messages: [], result: None }取数据user_input state[user_input]修改state[result] 晴天也经常看到取数据state.get(result)2.list—— 消息、工具、历史记录都经常用例如messages [ {role: user, content: 你好}, {role: assistant, content: 你好有什么可以帮你} ]遍历for message in messages: print(message[content])添加messages.append({ role: user, content: 帮我查天气 })Agent 中经常看到messages[-1]意思就是获取最后一条消息。3.def—— Agent 的每个节点基本都可以理解成函数例如def search_weather(city): result weather_api(city) return result工作流用户输入 ↓ 意图识别 ↓ 搜索天气 ↓ 生成回答对应def intent_node(state): ... def weather_node(state): ... def answer_node(state): ...所以你看到def xxx(state):第一反应应该是这是一个工作流节点/工具/处理函数。4.return—— 搞懂数据怎么在 Agent 节点之间流动比如def weather_node(state): weather 晴天 return { weather: weather }然后下一个节点def answer_node(state): weather state[weather] return { answer: f今天是{weather} //没有f的话直接输出今天是{weather} }你要建立一个非常重要的概念函数输入 ↓ state ↓ 函数内部处理 ↓ return ↓ 下一个节点这对理解 LangGraph 之类的 Agent 工作流特别重要。5.if—— Agent 决策逻辑例如if user_input 天气: return weather elif user_input 新闻://python中直接比较的是值 return news else: return chatAgent 工作流里面经常就是┌→ Weather Agent 用户 → 意图判断 ┤ ├→ Search Agent │ └→ Chat AgentPythonif intent weather: ... elif intent search: ... else: ...所以条件判断 Agent 路由逻辑的基础。6.for—— 批量处理数据例如搜索返回results [ {title: 新闻1}, {title: 新闻2}, {title: 新闻3} ]处理for result in results: print(result[title])Agent 中特别常见for tool in tools: ...或者for message in messages: ...或者for document in documents: ...7.try / except—— Agent 必须会因为 Agent 会疯狂调用LLM ↓ 搜索 API ↓ 数据库 ↓ 第三方 API ↓ 工具任何一步都可能报错。所以try: result api.call() except Exception as e: print(e)更实际一点try: result await llm.ainvoke(messages) except Exception as e: return { error: str(e) }你以后看到except Exception as e:要知道这里是在兜底处理 Agent 运行过程中的异常。四、class—— Agent 框架代码里非常重要这个可能是刚入门 Python 最容易懵的。比如class WeatherTool: def __init__(self, api_key): self.api_key api_key def run(self, city): return 北京晴天使用tool WeatherTool(xxx) result tool.run(北京)你需要理解三个东西class定义一个对象/组件。__init__初始化。self代表当前对象。Agent 框架里经常把Tool Memory Agent Retriever Model State封装成 class。所以看到class XXX:你要能基本看懂。五、async / await—— Agent 开发必须补上的知识这个非常重要。普通函数result llm.invoke(prompt)异步result await llm.ainvoke(prompt) llm.ainvoke(prompt)调用 LLM让大模型根据 prompt 生成结果。async await 一般只能出现在 async def 函数里面等待 llm.ainvoke(prompt) 这个异步任务返回结果然后再继续执行当前这行后面的代码。函数async def call_llm(): result await llm.ainvoke(prompt) return result理解成async def ↓ 这个函数里面存在异步操作 await ↓ 等待这个操作完成因为 Agent 经常需要LLM ↓ API ↓ 数据库 ↓ 搜索很多都是 IO 操作所以异步代码非常常见。六、装饰器—— Agent 框架里会大量出现例如tool def search_weather(city: str): return 北京晴天你可能会问tool是什么简单理解tool def search_weather(): ...相当于告诉框架把这个 Python 函数注册成一个 Agent 可以调用的 Tool。以后你还会看到app.route(...)staticmethodproperty以及各种框架自己的装饰器。所以至少要看懂装饰器是什么不需要一开始深入研究装饰器底层实现。七、类型提示 —— Agent 代码里特别常见例如def search(city: str) - str: ...意思city ↓ 应该是 str 函数返回 ↓ 应该是 str再比如def process(state: dict) - dict: ...以及from typing import List, Optional def search( query: str, top_k: int 5 ) - List[str]: ... query 参数应该是字符串类型 top_k 应该是整数如果调用函数时不传它就默认使用 5。 这个函数预计返回一个 List[str]也就是“字符串列表”。 这个 : 表示函数定义结束下面缩进的代码属于这个函数。 有返回你想要的值那么结果返回None。这些你一定要能读懂。八、Pydantic—— Agent 开发非常值得学后面你做结构化输出的时候会经常遇到from pydantic import BaseModel class UserInfo(BaseModel): name: str age: int city: str然后user UserInfo( name张三, age25, city北京 )它解决的问题就是规定 Agent 输入/输出的数据结构。比如让 LLM 输出{ name: 张三, age: 25, city: 北京 }而不是张三今年25岁住在北京哈哈。所以做 Agent 后Pydantic 很值得掌握。九、环境变量 —— API Key 基本离不开你会经常看到import os api_key os.getenv(OPENAI_API_KEY)或者from dotenv import load_dotenv load_dotenv().envOPENAI_API_KEYxxxx然后os.getenv(OPENAI_API_KEY)这套东西一定要会。十、最后是这些“进阶但很常见”的结构列表推导式names [user[name] for user in users]等价于names [] for user in users: names.append(user[name])Agent 数据处理经常用。lambdaresults.sort(keylambda x: x[score])看到不用害怕。简单理解lambda 临时定义一个很短的小函数。*argsdef test(*args): print(args)允许传任意数量的位置参数。**kwargsdef test(**kwargs): print(kwargs)允许传任意数量的关键字参数。Agent 框架里非常常见def invoke(input, **kwargs): ...所以至少要能看懂。yield流式输出的时候会碰到def stream(): yield 你好 yield 我是 yield AIAgent/LLM Streaming你 ↓ 好 ↓ ↓ 我 ↓ 是 ↓ AI就可能涉及yield。
返回列表