Agent开发第1步:抽象模型接口 (Model Adapter)

在开发一个智能 Agent 时,最核心的"大脑"就是大语言模型(LLM)。不同的 LLM 厂商(如 OpenAI、Anthropic、智谱等)提供了各自的 API 格式。为了让我们的 Agent 能够无缝切换和兼容不同的模型,我们需要在第1步引入 模型适配器 (Model Adapter) 的概念。

1. 为什么需要 Model Adapter?

如果没有适配器,我们的核心业务代码将会和具体的 LLM API 强耦合,这会导致后期更换模型成本极高。通过抽象一层 Model Adapter,我们可以将各种大模型的接口统一封装,向上层暴露一致的提问与流式返回接口。

2. 两种常见的 API 交互模式

在抽象模型接口时,我们通常需要处理两种主流的交互模式:

模式一:Chat Completion API(手动维护上下文)

这是最基础也最常见的模式。每次请求时,客户端需要将整个对话历史(Context)发送给服务器。

工作流:

Python 代码示例:

python 复制代码
from typing import List, Dict, Generator
import openai

class ChatCompletionAdapter:
    def __init__(self, api_key: str, model: str = "gpt-4o"):
        self.client = openai.Client(api_key=api_key)
        self.model = model

    def chat_stream(self, messages: List[Dict[str, str]]) -> Generator[str, None, None]:
        """
        手动维护上下文模式
        :param messages: 完整的对话历史,例如 [{"role": "user", "content": "你好"}]
        """
        response = self.client.chat.completions.create(
            model=self.model,
            messages=messages,
            stream=True
        )
        
        for chunk in response:
            if chunk.choices[0].delta.content is not None:
                yield chunk.choices[0].delta.content

# 使用示例
adapter = ChatCompletionAdapter(api_key="your-api-key")
history = [
    {"role": "system", "content": "你是一个有用的助手。"},
    {"role": "user", "content": "请用Python写一个Hello World。"}
]

print("Assistant: ", end="")
for token in adapter.chat_stream(history):
    print(token, end="", flush=True)

模式二:Responses / Threads API(自动托管上下文)

随着 OpenAI Assistants API 等新型接口的推出,服务端开始支持托管对话状态(Threads)。在这种模式下,我们只需要传入一个 Thread ID,服务器会自动维护历史记录,无需每次传递冗长的上下文。

工作流:

Python 代码示例:

python 复制代码
class ThreadResponseAdapter:
    def __init__(self, api_key: str):
        self.client = openai.Client(api_key=api_key)

    def add_message_and_run(self, thread_id: str, assistant_id: str, new_message: str) -> Generator[str, None, None]:
        """
        托管上下文模式
        :param thread_id: 服务端维护的会话 ID
        :param assistant_id: 关联的 Assistant ID
        :param new_message: 当前用户的最新提问
        """
        # 1. 向 Thread 中追加新消息
        self.client.beta.threads.messages.create(
            thread_id=thread_id,
            role="user",
            content=new_message
        )
        
        # 2. 运行 Assistant 并流式获取结果
        stream = self.client.beta.threads.runs.create_and_stream(
            thread_id=thread_id,
            assistant_id=assistant_id
        )
        
        for event in stream:
            if event.event == 'thread.message.delta':
                yield event.data.delta.content[0].text.value

# 使用示例
adapter = ThreadResponseAdapter(api_key="your-api-key")
# 假设 thread_id 和 assistant_id 已经提前创建好
for token in adapter.add_message_and_run("thread_123", "asst_456", "我刚才问了你什么?"):
    print(token, end="", flush=True)

总结

通过引入 Model Adapter,我们为 Agent 提供了一个干净的文本输入输出层。无论是传统的 Chat Completion 还是先进的 Threads API,都可以被隐藏在统一的接口之后。这是搭建强大 Agent 框架的基石。在下一篇文章中,我们将探讨如何为这个"大脑"装上可以操作外部世界的"双手"------定义工具抽象 (Tools)。

相关推荐
Capricorn19881 小时前
知芽 Notebook Skill 引用存在性校验与单元记忆破解幽灵引用危机
大数据·论文阅读·人工智能·论文笔记
有Li1 小时前
AI帮你做CT/MR分割,想分哪里分哪里
人工智能·学习·医学生
redreamSo1 小时前
想给产品加一个 AI 搜索,是上向量数据库还是用 MongoDB 就够了?
数据库·人工智能·mongodb
桃西西呀1 小时前
换个会话就失忆?拆开 Agent 记忆的 4 层与 4 个流派,附9个坑的自检清单
人工智能·llm·ai编程
山铃1 小时前
Agent开发第2步:定义工具抽象 (Tools)
人工智能
桃西西呀1 小时前
风控模型说自己 80% 准,却漏掉了 76% 该拦的人:一次把模型评估讲透
人工智能·机器学习·llm
山铃1 小时前
Agent开发第4步:定义 RunEvent
人工智能
鲜于言悠9051 小时前
2026 AI Agent完整学习路线:6个阶段,从入门到可接商业项目
人工智能
Blockchina1 小时前
从一个 AI 助手到一支 AI 团队:用 Grok Bot 搭建自媒体内容流水线
人工智能