AI Agent开发实战:Python SDK编排与工具调用框架解析
在人工智能应用开发领域,AI Agent(智能体)已成为实现复杂任务自动化的关键技术。其核心原理在于通过大语言模型(LLM)理解用户意图,并协调调用外部工具完成特定操作,从而扩展AI的能力边界。这种编排(Orchestration)机制的技术价值在于将自然语言交互与程序化功能无缝衔接,极大提升了开发效率和人机协作体验。在实际工程实践中,开发者常需构建能够处理工具调用(Tool Calling)、管
1. 项目概述:一个Python SDK的诞生与价值
最近在AI应用开发圈里,一个词被反复提及: AI Agent 。无论是想做一个能自动处理邮件的助手,还是构建一个能理解复杂指令并调用多个工具完成任务的智能体,开发者们都在寻找一个能快速上手的“脚手架”。正是在这个背景下,我注意到了 KeyID-AI/sdk-py 这个项目。简单来说,这是一个为AI Agent开发量身定制的Python软件开发工具包。它不是另一个大语言模型的封装,而是一个专注于 编排(Orchestration) 和 工具调用(Tool Calling) 的框架。如果你厌倦了在每次启动新项目时,都要重复搭建LLM调用、对话历史管理、工具函数注册与执行的轮子,那么这个SDK很可能就是你一直在找的“瑞士军刀”。它试图将Agent开发中那些繁琐但通用的部分标准化,让开发者能更专注于业务逻辑和Prompt工程本身。接下来,我将从设计思路、核心实现到实战避坑,为你完整拆解这个SDK。
2. 核心设计理念与架构拆解
2.1 为什么需要另一个AI SDK?
市面上已经存在不少优秀的LLM SDK,比如OpenAI官方库、LangChain、LlamaIndex等。 KeyID-AI/sdk-py 的定位非常明确: 轻量、专注、强类型 。它不追求大而全的生态,而是聚焦于解决AI Agent开发中最核心的“循环”:接收用户输入 -> 调用LLM进行意图理解并决定下一步行动(思考或调用工具)-> 执行工具 -> 将结果返回给LLM进行下一步判断 -> 最终输出给用户。这个循环的稳定、高效运行,是Agent智能体的基石。该SDK的设计目标就是让这个循环的实现变得极其简单和可靠。
2.2 架构总览:以会话和工具为核心
整个SDK的架构围绕两个核心概念展开: Session (会话)和 Tool (工具)。
-
Session:这是Agent的运行时环境。它封装了与LLM的通信、维护对话历史(Memory)、管理已注册的工具集,并驱动着上述的“思考-行动”循环。一个Session对象就是一个独立的、有状态的Agent实例。 -
Tool:这是Agent能力的延伸。任何你想让Agent执行的操作,无论是查询天气、计算器、搜索数据库,还是调用一个复杂的API,都可以封装成一个Tool。SDK通过强类型和装饰器,让工具的定义和注册变得清晰且安全。
这种架构带来的直接好处是 关注点分离 。作为开发者,你只需要:
- 定义好你的工具函数(用清晰的类型注解描述输入输出)。
- 创建一个Session,配置好LLM(如API密钥、模型选择)。
- 将工具注册到Session中。
- 然后,就可以通过一个简单的
session.run(“用户查询”)来启动整个智能流程。
2.3 关键设计决策解析
1. 强类型优先 SDK重度依赖Python的Type Hints。这不仅是为了代码美观和IDE自动补全,更是为了 实现可靠的“工具调用” 。当LLM决定调用一个工具时,SDK需要将LLM生成的、可能是非结构化的文本参数,安全地转换为工具函数所需的Python类型(如 int , str , List[str] , 甚至是自定义的Pydantic模型)。强类型系统为这个转换过程提供了精确的蓝图和运行时验证,极大减少了参数解析错误。
2. 极简的API设计 对比一些功能庞大的框架, KeyID-AI/sdk-py 的API数量被刻意控制。核心的类和方法可能不超过10个。这降低了学习成本,也让代码更易于调试。它的哲学是:“做好一件事,并做到极致”。这件事就是 可靠地完成一次LLM推理和工具调用的循环 。
3. 内置的对话历史管理 Session对象自动维护着用户与Agent的对话历史。这个历史记录会在每次调用LLM时作为上下文发送过去。SDK通常会提供一些内存管理策略,比如只保留最近N轮对话,或者通过总结来压缩历史,以防止上下文窗口过长。这是构建连贯对话体验的基础,而开发者无需手动拼接消息列表。
3. 从零开始:环境搭建与第一个Agent
3.1 安装与基础依赖
安装过程非常标准,使用pip即可。由于SDK的核心是与LLM API交互,所以你需要准备一个LLM服务提供商的API密钥,比如OpenAI、Anthropic(Claude)或国内的一些兼容OpenAI API的平替服务。
# 安装SDK
pip install keyid-ai-sdk
# 通常还需要安装对应的LLM库,例如使用OpenAI
pip install openai
注意 :务必通过官方渠道(如PyPI)安装,并注意包名可能是
keyid-ai-sdk或类似形式,具体需查看项目README。避免从来源不明的仓库安装,以防安全风险。
3.2 定义你的第一个工具
让我们从一个最简单的工具开始:一个计算器。工具的本质就是一个Python函数,但需要用SDK提供的装饰器来“声明”它,并为参数和返回值提供清晰的类型注解和描述。
from keyid_ai import tool
from pydantic import BaseModel, Field
# 使用Pydantic模型定义复杂的输入参数,这能提供最好的类型安全和LLM可读性
class CalculatorInput(BaseModel):
a: float = Field(..., description=”第一个操作数”)
b: float = Field(..., description=”第二个操作数”)
operator: str = Field(..., description=”运算符,支持 ‘+’, ‘-‘, ‘*’, ‘/’“)
@tool(“calculator”, description=”执行简单的四则运算。”)
def calculate(input: CalculatorInput) -> float:
“”“根据运算符计算a和b的结果。”“”
if input.operator == ‘+’:
return input.a + input.b
elif input.operator == ‘-‘:
return input.a - input.b
elif input.operator == ‘*’:
return input.a * input.b
elif input.operator == ‘/’:
if input.b == 0:
raise ValueError(“除数不能为零”)
return input.a / input.b
else:
raise ValueError(f”不支持的运算符: {input.operator}”)
关键点解析 :
@tool装饰器:这是将普通函数“升级”为Agent可用工具的关键。它接收工具名和描述,这个描述对于LLM理解工具用途至关重要。- Pydantic模型 :强烈建议使用
BaseModel来定义工具输入。Field中的description字段会被SDK提取,并用于生成给LLM的“工具说明书”,帮助LLM准确理解每个参数的意义。 - 类型注解 :函数签名
-> float明确告知SDK和LLM,这个工具将返回一个浮点数。这保证了输出类型的一致性。
3.3 创建会话并运行Agent
有了工具,下一步就是创建Session,将工具装配进去,然后与Agent对话。
import asyncio
from keyid_ai import Session
from openai import AsyncOpenAI
# 1. 初始化LLM客户端 (这里以OpenAI为例)
client = AsyncOpenAI(api_key=”your-api-key-here”)
# 2. 创建Session
async def main():
session = Session(
llm_client=client, # 传入LLM客户端
model=”gpt-4-turbo”, # 指定模型
tools=[calculate], # 注册工具列表
system_prompt=”你是一个乐于助人的助手,可以帮用户进行数学计算。” # 系统指令,设定Agent角色
)
# 3. 运行Agent
response = await session.run(“请帮我计算一下 125 乘以 48 等于多少?”)
print(f”Agent: {response}”)
# 运行异步函数
asyncio.run(main())
当你运行这段代码时,幕后会发生一系列精妙的操作:
session.run将用户问题“请帮我计算一下 125 乘以 48 等于多少?”和系统提示、对话历史(初始为空)一起发送给LLM。- LLM根据你的工具描述,识别出需要调用
calculator工具,并尝试生成符合CalculatorInput模型的参数:{“a”: 125, “b”: 48, “operator”: “*”}。 - SDK接收到LLM的“工具调用请求”,安全地解析参数,并执行
calculate函数。 - 函数返回结果
6000。 - SDK将这个结果作为“工具执行结果”再次发送给LLM。
- LLM结合结果和对话上下文,生成最终的自然语言回复,例如:“125乘以48等于6000。”
session.run返回这个最终回复。
整个过程,你只需要发起一次对话,SDK自动处理了多轮的LLM交互和工具调用。这就是Agent编排的核心价值。
4. 核心功能深度解析与高级用法
4.1 工具系统的进阶使用
1. 处理复杂嵌套参数 现实中的工具参数可能非常复杂。Pydantic模型在这里大放异彩。
from typing import List, Optional
from pydantic import BaseModel, Field
from keyid_ai import tool
from datetime import date
class FlightSegment(BaseModel):
from_city: str = Field(…, description=”出发城市代码,如PEK”)
to_city: str = Field(…, description=”到达城市代码,如SHA”)
date: date = Field(…, description=”航班日期”)
class SearchFlightsInput(BaseModel):
passengers: int = Field(default=1, ge=1, le=9, description=”乘客人数”)
cabin_class: str = Field(default=”economy”, description=”舱位等级:economy, premium_economy, business, first”)
segments: List[FlightSegment] = Field(…, description=”航段列表,支持多程”)
direct_only: Optional[bool] = Field(default=False, description=”是否仅直飞”)
@tool(“search_flights”, description=”根据条件查询航班信息。”)
def search_flights(input: SearchFlightsInput) -> List[dict]:
# 模拟查询逻辑
return [{“flight_no”: “CA123”, “price”: 1500}]
2. 工具执行的错误处理与重试 工具执行可能失败(网络错误、参数无效等)。一个健壮的Agent需要处理这些情况。SDK通常允许你在Session层面配置错误处理策略,或者LLM自身可以根据工具执行的错误信息进行“反思”并重试。
# 在工具函数内部进行细致的错误处理是关键
@tool(“get_weather”, description=”获取指定城市的天气。”)
async def fetch_weather(city: str) -> str:
try:
# 模拟异步API调用
async with aiohttp.ClientSession() as session:
async with session.get(f”https://api.weather.com/{city}”, timeout=5) as resp:
if resp.status == 200:
data = await resp.json()
return f”{city}的天气是{data[‘condition’]},温度{data[‘temp’]}°C。”
else:
# 返回明确的错误信息,LLM可以理解并可能提示用户重试或更换城市
return f”查询{city}天气失败,API返回状态码{resp.status}。”
except asyncio.TimeoutError:
return “天气服务请求超时,请稍后再试。”
except Exception as e:
return f”获取天气时发生未知错误:{str(e)}。”
实操心得 :工具函数返回的字符串信息至关重要。当工具执行失败时,返回对人类和LLM都友好的错误描述(如“服务暂时不可用”),而不是抛出未处理的异常,能让LLM更好地理解状况并给出合适的回应,提升用户体验。
4.2 会话管理与记忆(Memory)
Session的核心职责之一是管理记忆。默认情况下,Session会以列表形式保存完整的对话历史。但对于长对话,这会导致Token消耗剧增和性能下降。
1. 记忆窗口与总结 高级用法中,你可以配置记忆策略。
from keyid_ai import Session
from keyid_ai.memory import BufferMemory, SummaryMemory
# 使用缓冲记忆:只保留最近N轮对话
session_with_buffer = Session(
llm_client=client,
model=”gpt-4”,
memory=BufferMemory(buffer_size=10), # 保留最近10轮对话
tools=[…]
)
# 使用总结记忆:定期将旧对话总结成一段摘要,节省Token
session_with_summary = Session(
llm_client=client,
model=”gpt-4”,
memory=SummaryMemory(llm_client=client, summary_trigger=5), # 每5轮对话触发一次总结
tools=[…]
)
2. 自定义记忆存储 你可以实现自己的 Memory 类,将对话历史存储到数据库(如Redis、SQLite)或向量数据库中,实现更复杂的记忆检索功能,比如基于语义搜索相关的历史对话。
from typing import List
from keyid_ai.schema import Message
from keyid_ai.memory import BaseMemory
class CustomDatabaseMemory(BaseMemory):
def __init__(self, db_connection):
self.db = db_connection
async def get_messages(self) -> List[Message]:
# 从数据库读取历史消息
rows = self.db.fetch(“SELECT role, content FROM chat_history ORDER BY timestamp”)
return [Message(role=row[‘role’], content=row[‘content’]) for row in rows]
async def add_message(self, message: Message):
# 将新消息存入数据库
self.db.execute(“INSERT INTO chat_history (role, content) VALUES (?, ?)”, (message.role, message.content))
async def clear(self):
# 清空记忆
self.db.execute(“DELETE FROM chat_history”)
4.3 流式输出与实时交互
对于需要长时间运行或希望提供实时反馈的Agent,流式输出(Streaming)是必备功能。 KeyID-AI/sdk-py 通常支持以异步生成器(async generator)的形式返回流式响应。
async def chat_with_streaming():
session = Session(llm_client=client, model=”gpt-4”, tools=[calculate])
user_query = “请分步计算 (12 + 34) * 2 的值。”
# 使用 arun_stream 或类似方法
stream = session.arun_stream(user_query)
print(“Agent: “, end=””, flush=True)
async for chunk in stream:
# chunk 可能是文本片段,也可能是工具调用开始/结束的标记
if isinstance(chunk, str):
print(chunk, end=””, flush=True) # 逐字打印,模拟打字机效果
# 这里可以更精细地处理不同类型的chunk,如工具调用状态
print() # 换行
# 运行
asyncio.run(chat_with_streaming())
这种方式非常适合构建WebSocket聊天界面,让用户看到Agent“思考”和“输出”的过程,体验更佳。
5. 构建实战项目:一个多功能个人助理Agent
让我们综合运用以上知识,构建一个稍微复杂点的个人助理Agent,它集成了计算、天气查询和简单的待办事项管理。
5.1 项目结构设计
personal_assistant/
├── main.py # 主程序入口
├── tools/ # 工具模块目录
│ ├── __init__.py
│ ├── calculator.py
│ ├── weather.py
│ └── todo.py
└── config.py # 配置文件(存放API密钥等)
5.2 工具模块实现
tools/weather.py
import aiohttp
import os
from pydantic import BaseModel, Field
from keyid_ai import tool
class WeatherInput(BaseModel):
city: str = Field(…, description=”城市名称,例如’北京‘、’上海‘”)
@tool(“get_weather”, description=”查询实时天气。”)
async def get_weather(input: WeatherInput) -> str:
api_key = os.getenv(“WEATHER_API_KEY”) # 从环境变量获取密钥
if not api_key:
return “未配置天气API密钥,无法查询。”
url = f”http://api.weatherapi.com/v1/current.json?key={api_key}&q={input.city}&aqi=no”
try:
async with aiohttp.ClientSession() as session:
async with session.get(url, timeout=10) as resp:
data = await resp.json()
if ‘current’ in data:
current = data[‘current’]
return f”{input.city}当前天气:{current[‘condition’][‘text’]},温度{current[‘temp_c’]}°C,湿度{current[‘humidity’]}%。”
else:
return f”未找到城市 {input.city} 的天气信息。”
except Exception as e:
return f”查询天气时出错:{str(e)}。”
tools/todo.py
from typing import List
from pydantic import BaseModel, Field
from keyid_ai import tool
# 简单的内存存储,实际项目应使用数据库
_todo_list = []
class AddTodoInput(BaseModel):
task: str = Field(…, description=”待办事项内容”)
class ListTodosInput(BaseModel):
pass # 无输入参数
@tool(“add_todo”, description=”添加一项待办事项。”)
def add_todo(input: AddTodoInput) -> str:
_todo_list.append(input.task)
return f”已添加待办事项:'{input.task}'。当前共有{len(_todo_list)}项待办。”
@tool(“list_todos”, description=”列出所有待办事项。”)
def list_todos(input: ListTodosInput) -> str:
if not _todo_list:
return “当前没有待办事项。”
tasks = “\n”.join([f”{i+1}. {task}” for i, task in enumerate(_todo_list)])
return f”当前待办事项列表:\n{tasks}”
5.3 主程序集成
main.py
import asyncio
import os
from dotenv import load_dotenv
from openai import AsyncOpenAI
from keyid_ai import Session
# 从本地工具模块导入
from tools.calculator import calculate
from tools.weather import get_weather
from tools.todo import add_todo, list_todos
load_dotenv() # 加载 .env 文件中的环境变量
async def main():
# 配置LLM客户端
client = AsyncOpenAI(
api_key=os.getenv(“OPENAI_API_KEY”),
base_url=os.getenv(“OPENAI_BASE_URL”, None) # 支持自定义端点
)
# 创建多功能助理Session
assistant = Session(
llm_client=client,
model=”gpt-4-turbo”, # 或 “gpt-3.5-turbo”
tools=[calculate, get_weather, add_todo, list_todos],
system_prompt=”””你是一个全能个人助理,名字叫小Key。你擅长数学计算、查询天气和管理待办事项。
请用友好、热情且简洁的中文与用户交流。在调用工具前,可以简要说明你将做什么。
“””,
memory=BufferMemory(buffer_size=20) # 保留较多轮次以维持上下文
)
print(“个人助理小Key已启动!输入’退出‘或’quit‘结束对话。\n”)
while True:
try:
user_input = input(“\n你: “).strip()
if user_input.lower() in [‘退出‘, ‘quit’, ‘exit’]:
print(“小Key: 再见!期待下次为你服务。”)
break
if not user_input:
continue
print(“小Key: “, end=””, flush=True)
# 使用流式输出获得更好的交互体验
response_stream = assistant.arun_stream(user_input)
full_response = “”
async for chunk in response_stream:
if isinstance(chunk, str):
print(chunk, end=””, flush=True)
full_response += chunk
print() # 换行
except KeyboardInterrupt:
print(“\n\n对话被中断。”)
break
except Exception as e:
print(f”\n抱歉,出了点问题:{e}”)
if __name__ == “__main__”:
asyncio.run(main())
5.4 配置与环境变量
.env 文件
OPENAI_API_KEY=sk-your-openai-key-here
# OPENAI_BASE_URL=https://api.openai.com/v1 # 默认,如需使用其他兼容服务可修改
WEATHER_API_KEY=your-weatherapi-key-here
运行 python main.py ,你就可以通过命令行与你的个人助理对话了。它可以理解“北京今天天气怎么样?”、“把’买牛奶‘加到待办列表”、“列出所有待办”以及“计算(23+77)/2”等复杂指令,并自动调用相应的工具。
6. 生产环境部署与性能优化
6.1 异步与并发处理
KeyID-AI/sdk-py 的核心API设计为异步(async/await),这是为了高效处理I/O密集型操作(网络请求)。在生产环境的Web服务(如FastAPI)中,你需要确保在异步上下文中调用。
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
# 假设已经初始化了全局的 assistant_session
class ChatRequest(BaseModel):
message: str
@app.post(“/chat”)
async def chat_endpoint(request: ChatRequest):
response = await assistant_session.run(request.message)
return {“response”: response}
对于需要同时处理大量用户请求的场景,要注意Session通常是有状态的(包含记忆)。你需要为每个用户或每个对话创建一个独立的Session实例,并妥善管理其生命周期(如使用连接池、定期清理过期会话)。
6.2 超时、重试与降级
网络请求和LLM调用可能不稳定,必须添加超时和重试机制。
import httpx
from openai import AsyncOpenAI
from tenacity import retry, stop_after_attempt, wait_exponential
# 配置具有超时和重试的HTTP客户端
timeout = httpx.Timeout(30.0, connect=5.0)
client = AsyncOpenAI(
api_key=api_key,
http_client=httpx.AsyncClient(timeout=timeout),
max_retries=3 # OpenAI库自带的重试
)
# 或者,在工具函数层面使用tenacity进行更精细的重试控制
from tenacity import retry, stop_after_attempt, wait_random_exponential
@retry(stop=stop_after_attempt(3), wait=wait_random_exponential(min=1, max=10))
async def unreliable_api_call():
# … 可能失败的API调用
pass
降级策略 :当主要工具(如天气API)失败时,可以设计一个备用的、更简单的工具,或者让LLM直接回复一个友好的降级信息。
6.3 监控与日志
在生产中,详细的日志对于调试和了解Agent行为至关重要。你可以在Session创建时注入自定义的日志处理器,或者使用装饰器记录每个工具的调用和结果。
import logging
from keyid_ai import Session, tool
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def log_tool_call(func):
async def wrapper(*args, **kwargs):
logger.info(f”Tool {func.__name__} called with args: {args}, kwargs: {kwargs}”)
try:
result = await func(*args, **kwargs)
logger.info(f”Tool {func.__name__} succeeded with result: {result[:100]}…”) # 截断长结果
return result
except Exception as e:
logger.error(f”Tool {func.__name__} failed with error: {e}”, exc_info=True)
raise
return wrapper
# 应用日志装饰器
@tool(“some_tool”)
@log_tool_call
async def some_tool_function(…):
…
监控关键指标,如:每次会话的LLM调用次数、总Token消耗、工具调用成功率、平均响应时间等,有助于评估成本和服务质量。
7. 常见问题排查与调试技巧
在实际使用中,你肯定会遇到各种问题。以下是一些常见场景及其排查思路。
7.1 LLM不调用工具
现象 :你明明注册了工具,但Agent总是用自然语言回答,而不触发工具调用。
- 检查工具描述 :工具函数和其参数的
description字段是否清晰、无歧义?LLM依赖这些描述来决定是否以及如何调用工具。尝试让描述更具体,例如“进行数学计算”改为“对两个数字进行加、减、乘、除运算”。 - 检查系统提示(System Prompt) :你的系统提示是否鼓励或要求Agent使用工具?可以加入明确指令,如“当你需要计算、查询信息或操作数据时,请务必使用我提供给你的工具。”
- 检查用户查询 :用户的问题是否足够明确?模糊的问题可能导致LLM选择直接回答。可以引导用户提出更具体的请求。
- 提升模型能力 :尝试换用更强大的模型(如从gpt-3.5-turbo切换到gpt-4)。更强的模型在工具调用遵循性上通常表现更好。
7.2 工具调用参数解析错误
现象 :LLM决定调用工具,但SDK报错,提示参数验证失败或类型转换错误。
- 审查Pydantic模型 :确保所有字段都有合适的类型和默认值(如果需要)。
Field(…)表示必填字段。 - 提供示例 :在参数的
description中,可以包含示例值。例如city: str = Field(…, description=”城市名称,例如’北京‘或’New York’“)。 - 启用调试日志 :查看SDK打印出的LLM原始响应,看它生成的参数JSON是否格式正确。有时LLM会生成多余的解释文字,需要SDK有良好的解析鲁棒性。
7.3 会话状态混乱或记忆丢失
现象 :对话进行到一半,Agent似乎“忘记”了之前聊过的内容。
- 确认Memory配置 :你使用的是哪种Memory?
BufferMemory有大小限制,旧的对话会被丢弃。SummaryMemory的总结可能丢失细节。 - 检查Session生命周期 :在Web服务中,是否错误地复用了同一个Session对象处理不同用户的请求?确保Session与用户/对话ID绑定。
- 手动管理记忆 :对于关键信息,可以在工具执行后,通过
session.add_message手动添加一条assistant角色的总结消息到历史中,强化记忆。
7.4 性能瓶颈
现象 :Agent响应很慢。
- 分析耗时环节 :使用
asyncio的计时或APM工具,确定是LLM API调用慢、网络延迟高,还是工具函数本身执行慢。 - 优化工具函数 :对于慢速工具(如调用外部API),考虑增加缓存、使用更快的库或异步优化。
- 精简上下文 :使用
SummaryMemory或定期清理过长的对话历史,减少每次请求的Token数量,这能直接提升LLM响应速度和降低费用。 - 并行化工具调用 :如果Agent需要调用多个 独立 的工具,可以探索SDK是否支持或自行实现并行调用,但这需要LLM模型本身支持并行工具调用(如gpt-4-turbo)。
7.5 成本控制
现象 :Token消耗过快,费用高昂。
- 监控Token使用 :大多数LLM API的响应头会包含本次请求消耗的Token数。定期统计并设置告警。
- 优化提示词 :精简系统提示和工具描述,在保证清晰的前提下减少字数。
- 使用更小模型 :对于简单的工具调用场景,
gpt-3.5-turbo可能已经足够,成本远低于gpt-4。 - 设置对话轮次上限 :在长时间对话后,主动建议用户开启新话题,并重置Session,避免历史上下文无限增长。
开发AI Agent是一个充满挑战但也极具成就感的过程。 KeyID-AI/sdk-py 这类框架的价值在于,它把最复杂、最容易出错的编排逻辑封装起来,提供了一个坚实可靠的基础。让你能从“如何让LLM和工具对话”的泥潭中抽身,将创造力集中在设计更智能的工具、打磨更精准的提示词、以及构建更美妙的用户体验上。从我自己的使用体验来看,从理解其设计哲学开始,然后亲手实现几个小工具并看到它们被成功调用,是掌握它的最快路径。遇到问题时,多看看LLM的原始请求和响应日志,大多数谜团都会在那里找到答案。
更多推荐




所有评论(0)