第 13 章 Agent 智能体源码开发与行业工具调用
13.1 Function Call 工具调用底层实现
13.1.1 工具注册与调用架构
from typing import Callable, Dict, Any, Listclass Tool:def __init__(self, name: str, description: str, function: Callable, parameters: Dict[str, Any]):self.name = nameself.description = descriptionself.function = functionself.parameters = parametersclass ToolRegistry:def __init__(self):self.tools: Dict[str, Tool] = {}def register(self, name: str, description: str, function: Callable, parameters: Dict[str, Any]):tool = Tool(name, description, function, parameters)self.tools[name] = tooldef get_tool(self, name: str) -> Tool:return self.tools.get(name)def list_tools(self) -> List[Tool]:return list(self.tools.values())def call_tool(self, name: str, **kwargs) -> Any:tool = self.get_tool(name)if tool is None:raise ValueError(f"工具 {name} 未注册")return tool.function(**kwargs)
13.1.2 工具定义示例
import requestsimport jsondef get_weather(city: str) -> str:url = f"http://api.weatherapi.com/v1/current.json?key=YOUR_API_KEY&q={city}"response = requests.get(url)if response.status_code == 200:data = response.json()return f"{city} 当前天气:{data['current']['temp_c']}度,{data['current']['condition']['text']}"else:return f"获取 {city} 天气失败"def search_web(query: str) -> str:url = f"https://api.search.com?q={query}"response = requests.get(url)if response.status_code == 200:results = response.json()["results"]summaries = [result["summary"] for result in results[:3]]return "".join(summaries)else:return "搜索失败"def calculate(expression: str) -> str:try:result = eval(expression)return f"计算结果:{expression} = {result}"except Exception as e:return f"计算错误:{e}"tool_registry = ToolRegistry()tool_registry.register(name="get_weather",description="获取指定城市的当前天气信息",function=get_weather,parameters={"city": {"type": "string", "description": "城市名称"}})tool_registry.register(name="search_web",description="在互联网上搜索信息",function=search_web,parameters={"query": {"type": "string", "description": "搜索查询词"}})tool_registry.register(name="calculate",description="计算数学表达式",function=calculate,parameters={"expression": {"type": "string", "description": "数学表达式"}})
13.1.3 Function Call 解析与执行
class FunctionCallParser:def __init__(self, tool_registry: ToolRegistry):self.tool_registry = tool_registrydef parse_function_call(self, model_output: str) -> Dict[str, Any]:import repattern = r"\{\{\s*tool_call\s*:\s*\{(.*?)\}\}\}"match = re.search(pattern, model_output, re.DOTALL)if match:try:json_str = "{" + match.group(1) + "}"return json.loads(json_str)except json.JSONDecodeError:return Nonereturn Nonedef execute_function_call(self, function_call: Dict[str, Any]) -> Any:tool_name = function_call.get("name")arguments = function_call.get("arguments", {})if tool_name is None:raise ValueError("缺少工具名称")return self.tool_registry.call_tool(tool_name, **arguments)def process_model_output(self, model_output: str) -> str:function_call = self.parse_function_call(model_output)if function_call:result = self.execute_function_call(function_call)return f"工具调用结果:{result}"return model_output
13.1.4 工具调用提示词
class ToolCallPrompt:def __init__(self, tool_registry:ToolRegistry):self.tool_registry = tool_registrydef build_prompt(self, user_query: str) -> str:tools_description = []for tool in self.tool_registry.list_tools():params_desc = ", ".join([f"{name} ({param['type']}): {param['description']}"for name, param in tool.parameters.items()])tools_description.append(f"- {tool.name}: {tool.description}(参数:{params_desc})")tools_text = "".join(tools_description)prompt = f"""你是一个智能助手,可以使用以下工具:可用工具:{tools_text}工具调用格式:{{{{tool_call: {{"name": "工具名称", "arguments": {{"参数名": "参数值"}}}}}}}如果需要使用工具,请按照上述格式调用。如果不需要使用工具,可以直接回答问题。用户问题:{user_query}"""return prompt
13.2 多 Agent 协作流程源码改造
13.2.1 Agent 定义
class Agent:def __init__(self, name: str, role: str, model, tool_registry: ToolRegistry):self.name = nameself.role = roleself.model = modelself.tool_registry = tool_registryself.function_parser = FunctionCallParser(tool_registry)def process(self, query: str, context: str = "") -> str:prompt = f"""你是 {self.name},你的角色是 {self.role}。上下文:{context}用户查询:{query}请根据你的角色回答问题或调用工具。"""input_ids = self.model.tokenizer.encode(prompt, return_tensors="pt").cuda()with torch.no_grad():output = self.model.generate(input_ids, max_new_tokens=512)response = self.model.tokenizer.decode(output[0], skip_special_tokens=True)return self.function_parser.process_model_output(response)
13.2.2 多 Agent 协作架构
class MultiAgentSystem:def __init__(self, agents: List[Agent]):self.agents = agentsself.agent_map = {agent.name: agent for agent in agents}def route(self, query: str) -> Agent:for agent in self.agents:if agent.role in query or self._matches_agent_role(agent, query):return agentreturn self.agents[0]def _matches_agent_role(self, agent: Agent, query: str) -> bool:role_keywords = {"财务分析师": ["财务", "报表", "利润", "收入", "成本"],"法律顾问": ["法律", "合同", "法规", "合规", "条款"],"技术专家": ["技术", "代码", "架构", "系统", "开发"],"客服专员": ["客服", "问题", "帮助", "支持", "反馈"]}keywords = role_keywords.get(agent.role, [])return any(keyword in query for keyword in keywords)def solve(self, query: str) -> str:agent = self.route(query)print(f"路由到 Agent: {agent.name} ({agent.role})")return agent.process(query)def collaborative_solve(self, query: str) -> str:results = []for agent in self.agents:print(f"Agent {agent.name} 正在处理...")result = agent.process(query)results.append({"agent": agent.name,"role": agent.role,"result": result})summary_agent = self.agent_map.get("总结专家", self.agents[0])context = "".join([f"{r['agent']} ({r['role']}): {r['result']}"for r in results])summary_query = f"请综合以下各Agent的回答,给出最终总结:{context}"return summary_agent.process(summary_query)
13.2.3 Agent 协作示例
financial_agent = Agent(name="财务分析师",role="财务分析师",model=deepseek_model,tool_registry=tool_registry)legal_agent = Agent(name="法律顾问",role="法律顾问",model=deepseek_model,tool_registry=tool_registry)tech_agent = Agent(name="技术专家",role="技术专家",model=deepseek_model,tool_registry=tool_registry)multi_agent_system = MultiAgentSystem([financial_agent, legal_agent, tech_agent])query = "分析某公司的财务状况并评估其法律合规风险"result = multi_agent_system.collaborative_solve(query)print(result)
13.3 企业 OA/ERP 系统接口对接实战
13.3.1 OA 系统对接
import requestsfrom datetime import datetimeclass OASystemConnector:def __init__(self, api_url: str, token: str):self.api_url = api_urlself.token = tokenself.headers = {"Authorization": f"Bearer {self.token}","Content-Type": "application/json"}def get_approval_status(self, request_id: str) -> Dict[str, Any]:url = f"{self.api_url}/api/approval/{request_id}"response = requests.get(url, headers=self.headers)if response.status_code == 200:return response.json()return {"error": f"获取审批状态失败: {response.status_code}"}def create_approval(self, data: Dict[str, Any]) -> Dict[str, Any]:url = f"{self.api_url}/api/approval"response = requests.post(url, headers=self.headers, json=data)if response.status_code == 201:return response.json()return {"error": f"创建审批失败: {response.status_code}"}def list_approvals(self, user_id: str, status: str = None) -> List[Dict[str, Any]]:url = f"{self.api_url}/api/approvals?user_id={user_id}"if status:url += f"&status={status}"response = requests.get(url, headers=self.headers)if response.status_code == 200:return response.json()return []
13.3.2 ERP 系统对接
class ERPSystemConnector:def __init__(self, api_url: str, token: str):self.api_url = api_urlself.token = tokenself.headers = {"Authorization": f"Bearer {self.token}","Content-Type": "application/json"}def get_inventory(self, product_id: str) -> Dict[str, Any]:url = f"{self.api_url}/api/inventory/{product_id}"response = requests.get(url, headers=self.headers)if response.status_code == 200:return response.json()return {"error": f"获取库存失败: {response.status_code}"}def create_order(self, order_data: Dict[str, Any]) -> Dict[str, Any]:url = f"{self.api_url}/api/orders"response = requests.post(url, headers=self.headers, json=order_data)if response.status_code == 201:return response.json()return {"error": f"创建订单失败: {response.status_code}"}def get_sales_data(self, start_date: str, end_date: str) -> Dict[str, Any]:url = f"{self.api_url}/api/sales?start_date={start_date}&end_date={end_date}"response = requests.get(url, headers=self.headers)if response.status_code == 200:return response.json()return {"error": f"获取销售数据失败: {response.status_code}"}
13.3.3 企业系统工具注册
def register_enterprise_tools(tool_registry: ToolRegistry, oa_connector: OASystemConnector, erp_connector: ERPSystemConnector):tool_registry.register(name="get_approval_status",description="获取审批流程状态",function=oa_connector.get_approval_status,parameters={"request_id": {"type": "string", "description": "审批单ID"}})tool_registry.register(name="create_approval",description="创建审批流程",function=oa_connector.create_approval,parameters={"data": {"type": "object", "description": "审批数据"}})tool_registry.register(name="get_inventory",description="获取产品库存",function=erp_connector.get_inventory,parameters={"product_id": {"type": "string", "description": "产品ID"}})tool_registry.register(name="get_sales_data",description="获取销售数据",function=erp_connector.get_sales_data,parameters={"start_date": {"type": "string", "description": "开始日期(YYYY-MM-DD)"},"end_date": {"type": "string", "description": "结束日期(YYYY-MM-DD)"}})
13.3.4 企业 Agent 实战
oa_connector = OASystemConnector(api_url="http://oa.company.com",token="your_oa_token")erp_connector = ERPSystemConnector(api_url="http://erp.company.com",token="your_erp_token")enterprise_tool_registry = ToolRegistry()register_enterprise_tools(enterprise_tool_registry, oa_connector, erp_connector)enterprise_agent = Agent(name="企业助手",role="企业智能助手",model=deepseek_model,tool_registry=enterprise_tool_registry)query = "查询产品A123的库存情况,并查看我的审批单状态"result = enterprise_agent.process(query)print(result)
本章小结:
本章详细介绍了 Agent 智能体的源码开发与行业工具调用,包括 Function Call 工具调用、多 Agent 协作流程和企业系统接口对接。这些技术为企业构建智能办公助手和自动化业务流程提供了完整的解决方案。 更多资讯:lxb20110121
夜雨聆风