Agent与大语言模型的集成

第14篇:Agent与大语言模型的集成


文章目录

  • 第14篇:Agent与大语言模型的集成
    • 摘要
    • 一、LLM集成概述
      • [1.1 LLM集成架构](#1.1 LLM集成架构)
      • [1.2 集成方式对比](#1.2 集成方式对比)
    • [二、LLM API调用](#二、LLM API调用)
      • [2.1 OpenAI API集成](#2.1 OpenAI API集成)
      • [2.2 通用LLM客户端](#2.2 通用LLM客户端)
    • 三、提示词工程
      • [3.1 提示词设计原则](#3.1 提示词设计原则)
      • [3.2 提示词模板管理](#3.2 提示词模板管理)
    • 四、上下文管理
      • [4.1 对话上下文管理](#4.1 对话上下文管理)
      • [4.2 上下文管理器](#4.2 上下文管理器)
    • 五、工具调用
      • [5.1 工具调用架构](#5.1 工具调用架构)
      • [5.2 工具调用框架](#5.2 工具调用框架)
    • 六、完整集成示例
      • [6.1 LLM驱动的Agent](#6.1 LLM驱动的Agent)
      • [6.2 集成架构图](#6.2 集成架构图)
    • 七、性能优化
      • [7.1 优化策略](#7.1 优化策略)
      • [7.2 缓存优化](#7.2 缓存优化)
    • 八、总结与下一步
      • [8.1 本文总结](#8.1 本文总结)
      • [8.2 下一步](#8.2 下一步)

摘要

本文深入探讨Agent与大语言模型(LLM)的集成方法,包括API调用、上下文管理、提示词工程和工具调用。通过理论讲解和代码示例,帮助读者理解如何将LLM的强大能力融入Agent系统。


一、LLM集成概述

1.1 LLM集成架构

#mermaid-svg-eNf7ASElgeaiw2eh{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-eNf7ASElgeaiw2eh .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-eNf7ASElgeaiw2eh .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-eNf7ASElgeaiw2eh .error-icon{fill:#552222;}#mermaid-svg-eNf7ASElgeaiw2eh .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-eNf7ASElgeaiw2eh .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-eNf7ASElgeaiw2eh .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-eNf7ASElgeaiw2eh .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-eNf7ASElgeaiw2eh .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-eNf7ASElgeaiw2eh .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-eNf7ASElgeaiw2eh .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-eNf7ASElgeaiw2eh .marker{fill:#333333;stroke:#333333;}#mermaid-svg-eNf7ASElgeaiw2eh .marker.cross{stroke:#333333;}#mermaid-svg-eNf7ASElgeaiw2eh svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-eNf7ASElgeaiw2eh p{margin:0;}#mermaid-svg-eNf7ASElgeaiw2eh .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-eNf7ASElgeaiw2eh .cluster-label text{fill:#333;}#mermaid-svg-eNf7ASElgeaiw2eh .cluster-label span{color:#333;}#mermaid-svg-eNf7ASElgeaiw2eh .cluster-label span p{background-color:transparent;}#mermaid-svg-eNf7ASElgeaiw2eh .label text,#mermaid-svg-eNf7ASElgeaiw2eh span{fill:#333;color:#333;}#mermaid-svg-eNf7ASElgeaiw2eh .node rect,#mermaid-svg-eNf7ASElgeaiw2eh .node circle,#mermaid-svg-eNf7ASElgeaiw2eh .node ellipse,#mermaid-svg-eNf7ASElgeaiw2eh .node polygon,#mermaid-svg-eNf7ASElgeaiw2eh .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-eNf7ASElgeaiw2eh .rough-node .label text,#mermaid-svg-eNf7ASElgeaiw2eh .node .label text,#mermaid-svg-eNf7ASElgeaiw2eh .image-shape .label,#mermaid-svg-eNf7ASElgeaiw2eh .icon-shape .label{text-anchor:middle;}#mermaid-svg-eNf7ASElgeaiw2eh .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-eNf7ASElgeaiw2eh .rough-node .label,#mermaid-svg-eNf7ASElgeaiw2eh .node .label,#mermaid-svg-eNf7ASElgeaiw2eh .image-shape .label,#mermaid-svg-eNf7ASElgeaiw2eh .icon-shape .label{text-align:center;}#mermaid-svg-eNf7ASElgeaiw2eh .node.clickable{cursor:pointer;}#mermaid-svg-eNf7ASElgeaiw2eh .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-eNf7ASElgeaiw2eh .arrowheadPath{fill:#333333;}#mermaid-svg-eNf7ASElgeaiw2eh .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-eNf7ASElgeaiw2eh .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-eNf7ASElgeaiw2eh .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-eNf7ASElgeaiw2eh .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-eNf7ASElgeaiw2eh .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-eNf7ASElgeaiw2eh .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-eNf7ASElgeaiw2eh .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-eNf7ASElgeaiw2eh .cluster text{fill:#333;}#mermaid-svg-eNf7ASElgeaiw2eh .cluster span{color:#333;}#mermaid-svg-eNf7ASElgeaiw2eh div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-eNf7ASElgeaiw2eh .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-eNf7ASElgeaiw2eh rect.text{fill:none;stroke-width:0;}#mermaid-svg-eNf7ASElgeaiw2eh .icon-shape,#mermaid-svg-eNf7ASElgeaiw2eh .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-eNf7ASElgeaiw2eh .icon-shape p,#mermaid-svg-eNf7ASElgeaiw2eh .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-eNf7ASElgeaiw2eh .icon-shape .label rect,#mermaid-svg-eNf7ASElgeaiw2eh .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-eNf7ASElgeaiw2eh .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-eNf7ASElgeaiw2eh .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-eNf7ASElgeaiw2eh :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Agent系统
LLM接口层
LLM服务
感知模块
决策模块
记忆模块
API客户端
提示词管理
响应解析
GPT系列
LLaMA
Qwen

1.2 集成方式对比

方式 优点 缺点 适用场景
API调用 简单、稳定、更新快 成本高、有调用限制 快速开发、原型验证
本地部署 隐私性好、无调用限制 资源需求高、部署复杂 企业级应用、敏感数据
混合模式 兼顾灵活性与隐私 架构复杂 大规模生产环境

二、LLM API调用

2.1 OpenAI API集成

Python示例:OpenAI客户端

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

class OpenAIClient:
    def __init__(self, api_key: str, model: str = "gpt-3.5-turbo"):
        self.client = openai.OpenAI(api_key=api_key)
        self.model = model
    
    def chat_completion(self, messages: List[Dict[str, str]], 
                       max_tokens: int = 1024,
                       temperature: float = 0.7) -> Optional[str]:
        try:
            response = self.client.chat.completions.create(
                model=self.model,
                messages=messages,
                max_tokens=max_tokens,
                temperature=temperature
            )
            return response.choices[0].message.content
        except Exception as e:
            print(f"Error calling OpenAI API: {e}")
            return None
    
    def embedding(self, text: str) -> Optional[List[float]]:
        try:
            response = self.client.embeddings.create(
                input=text,
                model="text-embedding-3-small"
            )
            return response.data[0].embedding
        except Exception as e:
            print(f"Error creating embedding: {e}")
            return None

2.2 通用LLM客户端

Python示例:通用LLM客户端

python 复制代码
import requests
from typing import List, Dict, Any, Optional

class LLMClient:
    def __init__(self, api_url: str, api_key: str = None):
        self.api_url = api_url
        self.api_key = api_key
    
    def generate(self, prompt: str, **kwargs) -> Optional[str]:
        headers = {
            "Content-Type": "application/json"
        }
        
        if self.api_key:
            headers["Authorization"] = f"Bearer {self.api_key}"
        
        payload = {
            "prompt": prompt,
            **kwargs
        }
        
        try:
            response = requests.post(self.api_url, json=payload, headers=headers)
            response.raise_for_status()
            return response.json().get("response", response.json().get("choices", [{}])[0].get("text"))
        except Exception as e:
            print(f"Error calling LLM API: {e}")
            return None
    
    def chat(self, messages: List[Dict[str, str]], **kwargs) -> Optional[str]:
        headers = {
            "Content-Type": "application/json"
        }
        
        if self.api_key:
            headers["Authorization"] = f"Bearer {self.api_key}"
        
        payload = {
            "messages": messages,
            **kwargs
        }
        
        try:
            response = requests.post(f"{self.api_url}/chat", json=payload, headers=headers)
            response.raise_for_status()
            return response.json().get("response", response.json().get("choices", [{}])[0].get("message", {}).get("content"))
        except Exception as e:
            print(f"Error calling LLM chat API: {e}")
            return None

三、提示词工程

3.1 提示词设计原则

#mermaid-svg-5WSGG63ZQ0qLkHHH{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-5WSGG63ZQ0qLkHHH .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-5WSGG63ZQ0qLkHHH .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-5WSGG63ZQ0qLkHHH .error-icon{fill:#552222;}#mermaid-svg-5WSGG63ZQ0qLkHHH .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5WSGG63ZQ0qLkHHH .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-5WSGG63ZQ0qLkHHH .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5WSGG63ZQ0qLkHHH .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5WSGG63ZQ0qLkHHH .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-5WSGG63ZQ0qLkHHH .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5WSGG63ZQ0qLkHHH .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5WSGG63ZQ0qLkHHH .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5WSGG63ZQ0qLkHHH .marker.cross{stroke:#333333;}#mermaid-svg-5WSGG63ZQ0qLkHHH svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5WSGG63ZQ0qLkHHH p{margin:0;}#mermaid-svg-5WSGG63ZQ0qLkHHH .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-5WSGG63ZQ0qLkHHH .cluster-label text{fill:#333;}#mermaid-svg-5WSGG63ZQ0qLkHHH .cluster-label span{color:#333;}#mermaid-svg-5WSGG63ZQ0qLkHHH .cluster-label span p{background-color:transparent;}#mermaid-svg-5WSGG63ZQ0qLkHHH .label text,#mermaid-svg-5WSGG63ZQ0qLkHHH span{fill:#333;color:#333;}#mermaid-svg-5WSGG63ZQ0qLkHHH .node rect,#mermaid-svg-5WSGG63ZQ0qLkHHH .node circle,#mermaid-svg-5WSGG63ZQ0qLkHHH .node ellipse,#mermaid-svg-5WSGG63ZQ0qLkHHH .node polygon,#mermaid-svg-5WSGG63ZQ0qLkHHH .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-5WSGG63ZQ0qLkHHH .rough-node .label text,#mermaid-svg-5WSGG63ZQ0qLkHHH .node .label text,#mermaid-svg-5WSGG63ZQ0qLkHHH .image-shape .label,#mermaid-svg-5WSGG63ZQ0qLkHHH .icon-shape .label{text-anchor:middle;}#mermaid-svg-5WSGG63ZQ0qLkHHH .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-5WSGG63ZQ0qLkHHH .rough-node .label,#mermaid-svg-5WSGG63ZQ0qLkHHH .node .label,#mermaid-svg-5WSGG63ZQ0qLkHHH .image-shape .label,#mermaid-svg-5WSGG63ZQ0qLkHHH .icon-shape .label{text-align:center;}#mermaid-svg-5WSGG63ZQ0qLkHHH .node.clickable{cursor:pointer;}#mermaid-svg-5WSGG63ZQ0qLkHHH .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-5WSGG63ZQ0qLkHHH .arrowheadPath{fill:#333333;}#mermaid-svg-5WSGG63ZQ0qLkHHH .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-5WSGG63ZQ0qLkHHH .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-5WSGG63ZQ0qLkHHH .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5WSGG63ZQ0qLkHHH .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-5WSGG63ZQ0qLkHHH .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5WSGG63ZQ0qLkHHH .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-5WSGG63ZQ0qLkHHH .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-5WSGG63ZQ0qLkHHH .cluster text{fill:#333;}#mermaid-svg-5WSGG63ZQ0qLkHHH .cluster span{color:#333;}#mermaid-svg-5WSGG63ZQ0qLkHHH div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-5WSGG63ZQ0qLkHHH .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-5WSGG63ZQ0qLkHHH rect.text{fill:none;stroke-width:0;}#mermaid-svg-5WSGG63ZQ0qLkHHH .icon-shape,#mermaid-svg-5WSGG63ZQ0qLkHHH .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5WSGG63ZQ0qLkHHH .icon-shape p,#mermaid-svg-5WSGG63ZQ0qLkHHH .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-5WSGG63ZQ0qLkHHH .icon-shape .label rect,#mermaid-svg-5WSGG63ZQ0qLkHHH .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5WSGG63ZQ0qLkHHH .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-5WSGG63ZQ0qLkHHH .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-5WSGG63ZQ0qLkHHH :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 提示词设计
明确任务
提供上下文
设定格式
控制输出
任务描述
预期输出
历史对话
领域知识
结构要求
语言风格
长度限制
内容约束

3.2 提示词模板管理

Python示例:提示词模板引擎

python 复制代码
from typing import Dict, Any

class PromptTemplate:
    def __init__(self):
        self.templates = {}
    
    def register_template(self, name: str, template: str):
        self.templates[name] = template
    
    def render(self, name: str, **kwargs) -> str:
        if name not in self.templates:
            raise ValueError(f"Template '{name}' not found")
        
        template = self.templates[name]
        return template.format(**kwargs)
    
    def load_templates(self, templates: Dict[str, str]):
        self.templates.update(templates)

class AgentPromptTemplates:
    def __init__(self):
        self.template_engine = PromptTemplate()
        self._load_default_templates()
    
    def _load_default_templates(self):
        self.template_engine.register_template(
            "task_analysis",
            """
            分析以下任务并生成执行步骤:
            
            任务:{task}
            
            请输出详细的执行步骤列表,每个步骤用数字编号。
            """
        )
        
        self.template_engine.register_template(
            "summarization",
            """
            请总结以下对话内容:
            
            对话历史:
            {history}
            
            请提供简洁明了的总结。
            """
        )
        
        self.template_engine.register_template(
            "action_selection",
            """
            根据当前状态选择最佳行动:
            
            当前状态:{state}
            可用行动:{actions}
            
            请输出你选择的行动名称。
            """
        )
    
    def get_task_analysis_prompt(self, task: str) -> str:
        return self.template_engine.render("task_analysis", task=task)
    
    def get_summarization_prompt(self, history: str) -> str:
        return self.template_engine.render("summarization", history=history)
    
    def get_action_selection_prompt(self, state: str, actions: str) -> str:
        return self.template_engine.render("action_selection", state=state, actions=actions)

四、上下文管理

4.1 对话上下文管理

#mermaid-svg-VFVmWHsupjFSsQSk{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-VFVmWHsupjFSsQSk .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-VFVmWHsupjFSsQSk .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-VFVmWHsupjFSsQSk .error-icon{fill:#552222;}#mermaid-svg-VFVmWHsupjFSsQSk .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-VFVmWHsupjFSsQSk .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-VFVmWHsupjFSsQSk .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-VFVmWHsupjFSsQSk .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-VFVmWHsupjFSsQSk .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-VFVmWHsupjFSsQSk .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-VFVmWHsupjFSsQSk .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-VFVmWHsupjFSsQSk .marker{fill:#333333;stroke:#333333;}#mermaid-svg-VFVmWHsupjFSsQSk .marker.cross{stroke:#333333;}#mermaid-svg-VFVmWHsupjFSsQSk svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-VFVmWHsupjFSsQSk p{margin:0;}#mermaid-svg-VFVmWHsupjFSsQSk .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-VFVmWHsupjFSsQSk .cluster-label text{fill:#333;}#mermaid-svg-VFVmWHsupjFSsQSk .cluster-label span{color:#333;}#mermaid-svg-VFVmWHsupjFSsQSk .cluster-label span p{background-color:transparent;}#mermaid-svg-VFVmWHsupjFSsQSk .label text,#mermaid-svg-VFVmWHsupjFSsQSk span{fill:#333;color:#333;}#mermaid-svg-VFVmWHsupjFSsQSk .node rect,#mermaid-svg-VFVmWHsupjFSsQSk .node circle,#mermaid-svg-VFVmWHsupjFSsQSk .node ellipse,#mermaid-svg-VFVmWHsupjFSsQSk .node polygon,#mermaid-svg-VFVmWHsupjFSsQSk .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-VFVmWHsupjFSsQSk .rough-node .label text,#mermaid-svg-VFVmWHsupjFSsQSk .node .label text,#mermaid-svg-VFVmWHsupjFSsQSk .image-shape .label,#mermaid-svg-VFVmWHsupjFSsQSk .icon-shape .label{text-anchor:middle;}#mermaid-svg-VFVmWHsupjFSsQSk .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-VFVmWHsupjFSsQSk .rough-node .label,#mermaid-svg-VFVmWHsupjFSsQSk .node .label,#mermaid-svg-VFVmWHsupjFSsQSk .image-shape .label,#mermaid-svg-VFVmWHsupjFSsQSk .icon-shape .label{text-align:center;}#mermaid-svg-VFVmWHsupjFSsQSk .node.clickable{cursor:pointer;}#mermaid-svg-VFVmWHsupjFSsQSk .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-VFVmWHsupjFSsQSk .arrowheadPath{fill:#333333;}#mermaid-svg-VFVmWHsupjFSsQSk .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-VFVmWHsupjFSsQSk .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-VFVmWHsupjFSsQSk .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-VFVmWHsupjFSsQSk .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-VFVmWHsupjFSsQSk .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-VFVmWHsupjFSsQSk .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-VFVmWHsupjFSsQSk .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-VFVmWHsupjFSsQSk .cluster text{fill:#333;}#mermaid-svg-VFVmWHsupjFSsQSk .cluster span{color:#333;}#mermaid-svg-VFVmWHsupjFSsQSk div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-VFVmWHsupjFSsQSk .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-VFVmWHsupjFSsQSk rect.text{fill:none;stroke-width:0;}#mermaid-svg-VFVmWHsupjFSsQSk .icon-shape,#mermaid-svg-VFVmWHsupjFSsQSk .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-VFVmWHsupjFSsQSk .icon-shape p,#mermaid-svg-VFVmWHsupjFSsQSk .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-VFVmWHsupjFSsQSk .icon-shape .label rect,#mermaid-svg-VFVmWHsupjFSsQSk .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-VFVmWHsupjFSsQSk .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-VFVmWHsupjFSsQSk .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-VFVmWHsupjFSsQSk :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 对话上下文
历史消息
用户信息
系统提示
上下文窗口
用户消息
Agent响应
窗口大小
截断策略
总结机制

4.2 上下文管理器

Python示例:对话上下文管理

python 复制代码
from typing import List, Dict, Any
from datetime import datetime

class ConversationContext:
    def __init__(self, max_tokens: int = 4096):
        self.messages: List[Dict[str, str]] = []
        self.max_tokens = max_tokens
        self.token_estimate = 0
    
    def add_message(self, role: str, content: str):
        message = {
            "role": role,
            "content": content,
            "timestamp": datetime.now().isoformat()
        }
        
        self.messages.append(message)
        self.token_estimate += len(content) // 4
        
        self._trim_context()
    
    def _trim_context(self):
        while self.token_estimate > self.max_tokens and len(self.messages) > 1:
            removed = self.messages.pop(0)
            self.token_estimate -= len(removed["content"]) // 4
    
    def get_messages(self) -> List[Dict[str, str]]:
        return self.messages.copy()
    
    def get_context_string(self) -> str:
        parts = []
        for msg in self.messages:
            parts.append(f"{msg['role']}: {msg['content']}")
        return "\n".join(parts)
    
    def clear(self):
        self.messages = []
        self.token_estimate = 0
    
    def summarize(self, llm_client) -> str:
        if len(self.messages) <= 1:
            return ""
        
        history_str = self.get_context_string()
        prompt = f"""
        请总结以下对话历史:
        
        {history_str}
        
        总结:
        """
        
        summary = llm_client.generate(prompt)
        
        self.clear()
        if summary:
            self.add_message("system", f"对话摘要:{summary}")
        
        return summary or ""

五、工具调用

5.1 工具调用架构

#mermaid-svg-oKrwG00xkJyREGY6{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-oKrwG00xkJyREGY6 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-oKrwG00xkJyREGY6 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-oKrwG00xkJyREGY6 .error-icon{fill:#552222;}#mermaid-svg-oKrwG00xkJyREGY6 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-oKrwG00xkJyREGY6 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-oKrwG00xkJyREGY6 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-oKrwG00xkJyREGY6 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-oKrwG00xkJyREGY6 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-oKrwG00xkJyREGY6 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-oKrwG00xkJyREGY6 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-oKrwG00xkJyREGY6 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-oKrwG00xkJyREGY6 .marker.cross{stroke:#333333;}#mermaid-svg-oKrwG00xkJyREGY6 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-oKrwG00xkJyREGY6 p{margin:0;}#mermaid-svg-oKrwG00xkJyREGY6 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-oKrwG00xkJyREGY6 .cluster-label text{fill:#333;}#mermaid-svg-oKrwG00xkJyREGY6 .cluster-label span{color:#333;}#mermaid-svg-oKrwG00xkJyREGY6 .cluster-label span p{background-color:transparent;}#mermaid-svg-oKrwG00xkJyREGY6 .label text,#mermaid-svg-oKrwG00xkJyREGY6 span{fill:#333;color:#333;}#mermaid-svg-oKrwG00xkJyREGY6 .node rect,#mermaid-svg-oKrwG00xkJyREGY6 .node circle,#mermaid-svg-oKrwG00xkJyREGY6 .node ellipse,#mermaid-svg-oKrwG00xkJyREGY6 .node polygon,#mermaid-svg-oKrwG00xkJyREGY6 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-oKrwG00xkJyREGY6 .rough-node .label text,#mermaid-svg-oKrwG00xkJyREGY6 .node .label text,#mermaid-svg-oKrwG00xkJyREGY6 .image-shape .label,#mermaid-svg-oKrwG00xkJyREGY6 .icon-shape .label{text-anchor:middle;}#mermaid-svg-oKrwG00xkJyREGY6 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-oKrwG00xkJyREGY6 .rough-node .label,#mermaid-svg-oKrwG00xkJyREGY6 .node .label,#mermaid-svg-oKrwG00xkJyREGY6 .image-shape .label,#mermaid-svg-oKrwG00xkJyREGY6 .icon-shape .label{text-align:center;}#mermaid-svg-oKrwG00xkJyREGY6 .node.clickable{cursor:pointer;}#mermaid-svg-oKrwG00xkJyREGY6 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-oKrwG00xkJyREGY6 .arrowheadPath{fill:#333333;}#mermaid-svg-oKrwG00xkJyREGY6 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-oKrwG00xkJyREGY6 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-oKrwG00xkJyREGY6 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-oKrwG00xkJyREGY6 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-oKrwG00xkJyREGY6 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-oKrwG00xkJyREGY6 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-oKrwG00xkJyREGY6 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-oKrwG00xkJyREGY6 .cluster text{fill:#333;}#mermaid-svg-oKrwG00xkJyREGY6 .cluster span{color:#333;}#mermaid-svg-oKrwG00xkJyREGY6 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-oKrwG00xkJyREGY6 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-oKrwG00xkJyREGY6 rect.text{fill:none;stroke-width:0;}#mermaid-svg-oKrwG00xkJyREGY6 .icon-shape,#mermaid-svg-oKrwG00xkJyREGY6 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-oKrwG00xkJyREGY6 .icon-shape p,#mermaid-svg-oKrwG00xkJyREGY6 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-oKrwG00xkJyREGY6 .icon-shape .label rect,#mermaid-svg-oKrwG00xkJyREGY6 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-oKrwG00xkJyREGY6 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-oKrwG00xkJyREGY6 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-oKrwG00xkJyREGY6 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} LLM工具调用
工具注册
工具描述
调用解析
执行结果
工具列表
参数定义
功能说明
参数说明
意图识别
参数提取
结果格式化
反馈给LLM

5.2 工具调用框架

Python示例:工具调用系统

python 复制代码
from typing import List, Dict, Any, Callable, Optional

class ToolRegistry:
    def __init__(self):
        self.tools: Dict[str, Dict[str, Any]] = {}
    
    def register_tool(self, name: str, func: Callable, description: str, parameters: List[Dict[str, str]]):
        self.tools[name] = {
            "function": func,
            "description": description,
            "parameters": parameters
        }
    
    def get_tool(self, name: str) -> Optional[Dict[str, Any]]:
        return self.tools.get(name)
    
    def get_tools_description(self) -> str:
        descriptions = []
        for name, info in self.tools.items():
            param_descriptions = ", ".join([f"{p['name']}: {p['description']}" for p in info["parameters"]])
            descriptions.append(f"- {name}: {info['description']} (参数: {param_descriptions})")
        return "\n".join(descriptions)
    
    def call_tool(self, name: str, **kwargs) -> Any:
        tool = self.get_tool(name)
        if not tool:
            return f"工具 {name} 不存在"
        
        try:
            return tool["function"](**kwargs)
        except Exception as e:
            return f"调用工具 {name} 时出错: {str(e)}"

class ToolCallingAgent:
    def __init__(self, llm_client):
        self.llm_client = llm_client
        self.tool_registry = ToolRegistry()
    
    def register_tools(self):
        self.tool_registry.register_tool(
            "search",
            self._search_tool,
            "搜索网络信息",
            [{"name": "query", "description": "搜索关键词"}]
        )
        
        self.tool_registry.register_tool(
            "calculator",
            self._calculator_tool,
            "执行数学计算",
            [{"name": "expression", "description": "数学表达式"}]
        )
    
    def _search_tool(self, query: str) -> str:
        return f"搜索结果:关于'{query}'的信息..."
    
    def _calculator_tool(self, expression: str) -> str:
        try:
            result = eval(expression)
            return f"计算结果: {result}"
        except Exception as e:
            return f"计算错误: {str(e)}"
    
    def process(self, user_input: str) -> str:
        tools_desc = self.tool_registry.get_tools_description()
        
        prompt = f"""
        你是一个工具调用助手。根据用户的请求,决定是否需要调用工具。
        
        可用工具:
        {tools_desc}
        
        用户请求:{user_input}
        
        如果需要调用工具,请输出:<tool_call>工具名(参数名=值)</tool_call>
        如果不需要调用工具,请直接回答用户问题。
        """
        
        response = self.llm_client.generate(prompt)
        
        if response and "<tool_call>" in response:
            tool_call = response.split("<tool_call>")[1].split("</tool_call>")[0]
            tool_name = tool_call.split("(")[0]
            params_str = tool_call.split("(")[1].rstrip(")")
            
            params = {}
            for param in params_str.split(","):
                if "=" in param:
                    key, value = param.split("=", 1)
                    params[key.strip()] = value.strip().strip("'\"")
            
            result = self.tool_registry.call_tool(tool_name, **params)
            
            summary_prompt = f"""
            用户请求:{user_input}
            工具执行结果:{result}
            
            请用自然语言总结工具执行结果给用户。
            """
            
            return self.llm_client.generate(summary_prompt)
        
        return response

六、完整集成示例

6.1 LLM驱动的Agent

Python示例:完整集成

python 复制代码
class LLMDrivenAgent:
    def __init__(self, llm_client):
        self.llm_client = llm_client
        self.context = ConversationContext()
        self.tool_agent = ToolCallingAgent(llm_client)
        self.tool_agent.register_tools()
    
    def respond(self, user_input: str) -> str:
        self.context.add_message("user", user_input)
        
        if self._needs_tool_call(user_input):
            return self.tool_agent.process(user_input)
        
        messages = self.context.get_messages()
        response = self.llm_client.chat(messages)
        
        if response:
            self.context.add_message("assistant", response)
        
        return response
    
    def _needs_tool_call(self, input_text: str) -> bool:
        tool_keywords = ["搜索", "计算", "查询", "查找", "帮我查"]
        return any(keyword in input_text for keyword in tool_keywords)
    
    def summarize_conversation(self) -> str:
        return self.context.summarize(self.llm_client)

6.2 集成架构图

#mermaid-svg-zu2q3UQCtGhJEzK4{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-zu2q3UQCtGhJEzK4 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-zu2q3UQCtGhJEzK4 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-zu2q3UQCtGhJEzK4 .error-icon{fill:#552222;}#mermaid-svg-zu2q3UQCtGhJEzK4 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-zu2q3UQCtGhJEzK4 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-zu2q3UQCtGhJEzK4 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-zu2q3UQCtGhJEzK4 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-zu2q3UQCtGhJEzK4 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-zu2q3UQCtGhJEzK4 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-zu2q3UQCtGhJEzK4 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-zu2q3UQCtGhJEzK4 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-zu2q3UQCtGhJEzK4 .marker.cross{stroke:#333333;}#mermaid-svg-zu2q3UQCtGhJEzK4 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-zu2q3UQCtGhJEzK4 p{margin:0;}#mermaid-svg-zu2q3UQCtGhJEzK4 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-zu2q3UQCtGhJEzK4 .cluster-label text{fill:#333;}#mermaid-svg-zu2q3UQCtGhJEzK4 .cluster-label span{color:#333;}#mermaid-svg-zu2q3UQCtGhJEzK4 .cluster-label span p{background-color:transparent;}#mermaid-svg-zu2q3UQCtGhJEzK4 .label text,#mermaid-svg-zu2q3UQCtGhJEzK4 span{fill:#333;color:#333;}#mermaid-svg-zu2q3UQCtGhJEzK4 .node rect,#mermaid-svg-zu2q3UQCtGhJEzK4 .node circle,#mermaid-svg-zu2q3UQCtGhJEzK4 .node ellipse,#mermaid-svg-zu2q3UQCtGhJEzK4 .node polygon,#mermaid-svg-zu2q3UQCtGhJEzK4 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-zu2q3UQCtGhJEzK4 .rough-node .label text,#mermaid-svg-zu2q3UQCtGhJEzK4 .node .label text,#mermaid-svg-zu2q3UQCtGhJEzK4 .image-shape .label,#mermaid-svg-zu2q3UQCtGhJEzK4 .icon-shape .label{text-anchor:middle;}#mermaid-svg-zu2q3UQCtGhJEzK4 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-zu2q3UQCtGhJEzK4 .rough-node .label,#mermaid-svg-zu2q3UQCtGhJEzK4 .node .label,#mermaid-svg-zu2q3UQCtGhJEzK4 .image-shape .label,#mermaid-svg-zu2q3UQCtGhJEzK4 .icon-shape .label{text-align:center;}#mermaid-svg-zu2q3UQCtGhJEzK4 .node.clickable{cursor:pointer;}#mermaid-svg-zu2q3UQCtGhJEzK4 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-zu2q3UQCtGhJEzK4 .arrowheadPath{fill:#333333;}#mermaid-svg-zu2q3UQCtGhJEzK4 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-zu2q3UQCtGhJEzK4 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-zu2q3UQCtGhJEzK4 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-zu2q3UQCtGhJEzK4 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-zu2q3UQCtGhJEzK4 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-zu2q3UQCtGhJEzK4 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-zu2q3UQCtGhJEzK4 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-zu2q3UQCtGhJEzK4 .cluster text{fill:#333;}#mermaid-svg-zu2q3UQCtGhJEzK4 .cluster span{color:#333;}#mermaid-svg-zu2q3UQCtGhJEzK4 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-zu2q3UQCtGhJEzK4 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-zu2q3UQCtGhJEzK4 rect.text{fill:none;stroke-width:0;}#mermaid-svg-zu2q3UQCtGhJEzK4 .icon-shape,#mermaid-svg-zu2q3UQCtGhJEzK4 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-zu2q3UQCtGhJEzK4 .icon-shape p,#mermaid-svg-zu2q3UQCtGhJEzK4 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-zu2q3UQCtGhJEzK4 .icon-shape .label rect,#mermaid-svg-zu2q3UQCtGhJEzK4 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-zu2q3UQCtGhJEzK4 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-zu2q3UQCtGhJEzK4 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-zu2q3UQCtGhJEzK4 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
用户
Agent入口
需要工具调用?
工具调用Agent
LLM对话
工具注册中心
执行工具
结果格式化
LLM总结
上下文管理
提示词构建
LLM调用
输出响应


七、性能优化

7.1 优化策略

#mermaid-svg-5H20QiiN1xLx4pne{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-5H20QiiN1xLx4pne .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-5H20QiiN1xLx4pne .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-5H20QiiN1xLx4pne .error-icon{fill:#552222;}#mermaid-svg-5H20QiiN1xLx4pne .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5H20QiiN1xLx4pne .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-5H20QiiN1xLx4pne .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5H20QiiN1xLx4pne .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5H20QiiN1xLx4pne .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-5H20QiiN1xLx4pne .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5H20QiiN1xLx4pne .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5H20QiiN1xLx4pne .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5H20QiiN1xLx4pne .marker.cross{stroke:#333333;}#mermaid-svg-5H20QiiN1xLx4pne svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5H20QiiN1xLx4pne p{margin:0;}#mermaid-svg-5H20QiiN1xLx4pne .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-5H20QiiN1xLx4pne .cluster-label text{fill:#333;}#mermaid-svg-5H20QiiN1xLx4pne .cluster-label span{color:#333;}#mermaid-svg-5H20QiiN1xLx4pne .cluster-label span p{background-color:transparent;}#mermaid-svg-5H20QiiN1xLx4pne .label text,#mermaid-svg-5H20QiiN1xLx4pne span{fill:#333;color:#333;}#mermaid-svg-5H20QiiN1xLx4pne .node rect,#mermaid-svg-5H20QiiN1xLx4pne .node circle,#mermaid-svg-5H20QiiN1xLx4pne .node ellipse,#mermaid-svg-5H20QiiN1xLx4pne .node polygon,#mermaid-svg-5H20QiiN1xLx4pne .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-5H20QiiN1xLx4pne .rough-node .label text,#mermaid-svg-5H20QiiN1xLx4pne .node .label text,#mermaid-svg-5H20QiiN1xLx4pne .image-shape .label,#mermaid-svg-5H20QiiN1xLx4pne .icon-shape .label{text-anchor:middle;}#mermaid-svg-5H20QiiN1xLx4pne .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-5H20QiiN1xLx4pne .rough-node .label,#mermaid-svg-5H20QiiN1xLx4pne .node .label,#mermaid-svg-5H20QiiN1xLx4pne .image-shape .label,#mermaid-svg-5H20QiiN1xLx4pne .icon-shape .label{text-align:center;}#mermaid-svg-5H20QiiN1xLx4pne .node.clickable{cursor:pointer;}#mermaid-svg-5H20QiiN1xLx4pne .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-5H20QiiN1xLx4pne .arrowheadPath{fill:#333333;}#mermaid-svg-5H20QiiN1xLx4pne .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-5H20QiiN1xLx4pne .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-5H20QiiN1xLx4pne .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5H20QiiN1xLx4pne .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-5H20QiiN1xLx4pne .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5H20QiiN1xLx4pne .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-5H20QiiN1xLx4pne .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-5H20QiiN1xLx4pne .cluster text{fill:#333;}#mermaid-svg-5H20QiiN1xLx4pne .cluster span{color:#333;}#mermaid-svg-5H20QiiN1xLx4pne div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-5H20QiiN1xLx4pne .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-5H20QiiN1xLx4pne rect.text{fill:none;stroke-width:0;}#mermaid-svg-5H20QiiN1xLx4pne .icon-shape,#mermaid-svg-5H20QiiN1xLx4pne .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5H20QiiN1xLx4pne .icon-shape p,#mermaid-svg-5H20QiiN1xLx4pne .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-5H20QiiN1xLx4pne .icon-shape .label rect,#mermaid-svg-5H20QiiN1xLx4pne .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5H20QiiN1xLx4pne .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-5H20QiiN1xLx4pne .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-5H20QiiN1xLx4pne :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 性能优化
缓存机制
请求批处理
模型选择
流式响应
语义缓存
结果缓存
批量调用
异步处理
模型选择
参数调优
实时输出
减少等待

7.2 缓存优化

Python示例:响应缓存

python 复制代码
from typing import Dict, Any, Optional
from datetime import datetime, timedelta

class ResponseCache:
    def __init__(self, max_age_minutes: int = 60):
        self.cache: Dict[str, Dict[str, Any]] = {}
        self.max_age = timedelta(minutes=max_age_minutes)
    
    def get(self, key: str) -> Optional[str]:
        entry = self.cache.get(key)
        if entry:
            if datetime.now() - entry["timestamp"] < self.max_age:
                return entry["value"]
            else:
                del self.cache[key]
        return None
    
    def set(self, key: str, value: str):
        self.cache[key] = {
            "value": value,
            "timestamp": datetime.now()
        }
    
    def clear(self):
        self.cache = {}
    
    def size(self) -> int:
        return len(self.cache)

八、总结与下一步

8.1 本文总结

本文介绍了Agent与大语言模型的集成:

  1. API调用:OpenAI客户端、通用LLM客户端
  2. 提示词工程:提示词设计原则、模板管理
  3. 上下文管理:对话历史管理、上下文窗口
  4. 工具调用:工具注册、调用解析、结果反馈
  5. 性能优化:缓存机制、批处理、流式响应

8.2 下一步

下一篇文章将介绍Agent的长期记忆与知识图谱。


上一篇:第13篇:Agent的情感与社交能力

下一篇:第15篇:Agent的长期记忆与知识图谱


相关推荐
BK贝壳6 小时前
亿级用户签到位图选型复盘:用 bool-hybrid-array 扛冷启动打卡,也把它和 Roaring/Redis 的边界测清楚了
数据结构·python·性能优化·numpy
2601_966949658 小时前
如何根据研究的起止时间截取分钟级行情?Python 实战与 QuantDash 数据处理指南
开发语言·python·pandas·量化交易·1024程序员节·股票数据·quantdash
在世修行12 小时前
智学文枢:页面切换与跨页数据预填
python·桌面应用·signal·1024程序员节·pyside·跨页跳转·状态预填
2601_9628857213 小时前
如何用 Python 把 K 线重采样成任意周期?
开发语言·python
打工仔折腾 AI13 小时前
在 Ubuntu ARM64 部署 Q1 V3.0 MuJoCo 模型:加载、单步推理与执行器响应解析
linux·运维·人工智能·python·深度学习·ubuntu·性能优化
信誓旦旦的程序猿14 小时前
【Python量化实战宝典 #21】北向资金跟随手册:聪明钱择时信号(Python 可跑)
python·1024程序员节·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
严谨的麻辣烫14 小时前
静态 ISP 代理请求超时怎么排查?Python 与 curl 实战
python·http·requests·1024程序员节·网络排障
KeepRobots15 小时前
11-01 温哥华不回拨:用 60 行 Python 查你的工单系统会不会差一小时(KeepRobots 工程笔记)
python
xiao77mwq15 小时前
你以为 OCR 慢?实测 81.3 s 里全是故障代价:如何把「定格态」消掉,让耗时从 6.5 s 到 13 倍差距显出原形
python