
第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与大语言模型的集成:
- API调用:OpenAI客户端、通用LLM客户端
- 提示词工程:提示词设计原则、模板管理
- 上下文管理:对话历史管理、上下文窗口
- 工具调用:工具注册、调用解析、结果反馈
- 性能优化:缓存机制、批处理、流式响应
8.2 下一步
下一篇文章将介绍Agent的长期记忆与知识图谱。
