Langchain-Chatchat高级功能:Agent机制与工具调用
Langchain-Chatchat高级功能:Agent机制与工具调用【免费下载链接】Langchain-ChatchatLangchain-Chatchat(原Langchain-ChatGLM)基于 Langchain 与 ChatGLM 等语言模型的本地知识库问答 | Langchain-Chatchat (f...
Langchain-Chatchat高级功能:Agent机制与工具调用
Langchain-Chatchat的Agent机制是基于LangChain框架构建的智能代理系统,通过将语言模型与外部工具相结合,使模型能够执行搜索、计算、数据库查询等实际操作。该系统采用分层架构设计和ReAct(Reasoning + Acting)工作模式,需要满足特定的模型支持、工具配置和系统配置要求才能启用。针对ChatGLM3和Qwen等模型进行了深度优化,并提供了完善的手动工具选择与参数配置机制。
Agent功能原理与启用条件
Langchain-Chatchat的Agent机制是基于LangChain框架构建的智能代理系统,它允许大语言模型通过工具调用来扩展其能力,实现更复杂的任务处理。Agent系统通过将语言模型与外部工具相结合,使模型能够执行搜索、计算、数据库查询等实际操作,从而提供更强大的问题解决能力。
Agent核心架构
Langchain-Chatchat的Agent系统采用分层架构设计,主要包括以下几个核心组件:
Agent工作原理
Agent的工作流程遵循经典的ReAct(Reasoning + Acting)模式:
- 思考(Reasoning):语言模型分析用户输入,确定需要执行的操作
- 行动(Acting):选择合适的工具并执行具体操作
- 观察(Observation):获取工具执行结果
- 循环处理:重复上述步骤直到获得最终答案
# Agent执行流程示例代码
async def agent_workflow(query, tools):
# 初始化Agent执行器
agent_executor = agents_registry(llm=llm, tools=tools)
# 执行Agent链
result = await agent_executor.ainvoke({
"input": query,
"chat_history": history_messages
})
return result
启用条件与配置要求
要成功启用Langchain-Chatchat的Agent功能,需要满足以下条件:
1. 模型支持要求
Agent功能仅支持特定的语言模型,系统内置了支持的模型列表:
| 模型名称 | 支持状态 | 特化优化 |
|---|---|---|
| chatglm3-6b | ✅ 支持 | 专用解析器 |
| glm-4 | ✅ 支持 | 专用解析器 |
| Qwen-2 | ✅ 支持 | 专用解析器 |
| qwen2-instruct | ✅ 支持 | 专用解析器 |
| gpt-3.5-turbo | ✅ 支持 | 通用解析器 |
| gpt-4o | ✅ 支持 | 通用解析器 |
| openai-api | ✅ 支持 | 通用解析器 |
配置文件中定义的支持模型列表:
SUPPORT_AGENT_MODELS:
- "chatglm3-6b"
- "glm-4"
- "openai-api"
- "Qwen-2"
- "qwen2-instruct"
- "gpt-3.5-turbo"
- "gpt-4o"
2. 工具配置要求
Agent需要至少一个已启用的工具才能正常工作。系统支持的工具包括:
| 工具名称 | 功能描述 | 启用配置 |
|---|---|---|
| search_local_knowledgebase | 本地知识库搜索 | tool_settings.search_local_knowledgebase.use = true |
| search_internet | 互联网搜索 | tool_settings.search_internet.use = true |
| calculate | 数学计算 | tool_settings.calculate.use = true |
| weather_check | 天气查询 | tool_settings.weather_check.use = true |
| text2images | 图像生成 | tool_settings.text2images.use = true |
工具配置示例:
search_local_knowledgebase:
use: true
top_k: 3
score_threshold: 2.0
search_internet:
use: true
search_engine_name: "duckduckgo"
top_k: 5
3. 系统配置要求
Agent功能的启用还需要正确的系统配置:
# model_settings.yaml 关键配置
Agent_MODEL: "" # 专用Agent模型,留空使用默认模型
LLM_MODEL_CONFIG:
action_model:
model: "" # Action模型配置
temperature: 0.01
max_tokens: 4096
prompt_name: "ChatGLM3"
Agent执行流程详解
当所有启用条件满足时,Agent的执行流程如下:
常见启用问题排查
如果Agent功能无法正常工作,可以检查以下方面:
- 模型兼容性:确认使用的模型在
SUPPORT_AGENT_MODELS列表中 - 工具配置:确保至少一个工具已启用(
use: true) - 依赖安装:检查所有工具所需的依赖包是否已安装
- API密钥:对于需要外部API的工具,确认API密钥配置正确
性能优化建议
为了获得最佳的Agent性能,建议:
- 模型选择:优先选择对Agent有特化优化的模型(如ChatGLM3、Qwen系列)
- 工具精简:只启用实际需要的工具,减少不必要的工具调用
- 超时配置:根据网络状况适当调整HTTP请求超时时间
- 缓存策略:对频繁使用的工具结果实施缓存机制
通过正确配置和优化,Langchain-Chatchat的Agent功能能够显著提升语言模型的问题解决能力,实现更智能、更实用的对话体验。
自动工具调用与参数解析机制
Langchain-Chatchat 的 Agent 系统通过智能化的自动工具调用与参数解析机制,实现了大语言模型与外部工具的深度集成。这一机制不仅能够自动识别用户意图并选择合适的工具,还能精确解析自然语言中的参数信息,完成复杂的多步骤任务执行。
工具注册与发现机制
系统通过装饰器模式实现工具的自动注册和发现。每个工具都使用 @regist_tool 装饰器进行注册,该装饰器会自动将工具添加到全局工具注册表中:
@regist_tool(title="数学计算器")
def calculate(text: str = Field(description="a math expression")) -> float:
"""
Useful to answer questions about simple calculations.
translate user question to a math expression that can be evaluated by numexpr.
"""
import numexpr
try:
ret = str(numexpr.evaluate(text))
except Exception as e:
ret = f"wrong: {e}"
return BaseToolOutput(ret)
工具注册过程包含以下关键步骤:
- 元数据自动提取:自动从函数文档字符串中提取工具描述
- 标题生成:根据函数名自动生成人类可读的标题
- 全局注册:将工具添加到
_TOOLS_REGISTRY全局字典中
参数解析与类型转换
系统通过增强的 BaseTool 类实现了智能参数解析机制:
def _new_parse_input(self, tool_input: Union[str, Dict]) -> Union[str, Dict[str, Any]]:
"""Convert tool input to pydantic model."""
input_args = self.args_schema
if isinstance(tool_input, str):
if input_args is not None:
key_ = next(iter(input_args.__fields__.keys()))
input_args.validate({key_: tool_input})
return tool_input
else:
if input_args is not None:
result = input_args.parse_obj(tool_input)
return result.dict()
参数解析流程如下:
结构化输出处理
系统通过 BaseToolOutput 类统一处理工具的输出格式,确保 LLM 能够正确理解和处理工具返回的结果:
class BaseToolOutput:
def __init__(self, data: Any, format: str | Callable = None, **extras: Any):
self.data = data
self.format = format
self.extras = extras
def __str__(self) -> str:
if self.format == "json":
return json.dumps(self.data, ensure_ascii=False, indent=2)
elif callable(self.format):
return self.format(self)
else:
return str(self.data)
输出处理支持多种格式:
| 输出格式 | 处理方式 | 适用场景 |
|---|---|---|
| JSON格式 | 自动序列化为标准JSON字符串 | 结构化数据返回 |
| 自定义格式化 | 通过回调函数自定义输出格式 | 特殊格式需求 |
| 字符串格式 | 直接转换为字符串 | 简单文本输出 |
工具调用执行流程
自动工具调用的完整执行流程涉及多个组件的协同工作:
参数验证与错误处理
系统内置了完善的参数验证机制,确保工具调用的安全性和稳定性:
def _new_to_args_and_kwargs(self, tool_input: Union[str, Dict]) -> Tuple[Tuple, Dict]:
if isinstance(tool_input, str):
return (tool_input,), {}
else:
if "args" in tool_input:
args = tool_input["args"]
if args is None:
tool_input.pop("args")
return (), tool_input
elif isinstance(args, tuple):
tool_input.pop("args")
return args, tool_input
return (), tool_input
错误处理策略包括:
- 类型验证:确保参数类型符合工具要求
- 格式转换:自动将字符串参数转换为合适的数据结构
- 异常捕获:优雅处理工具执行过程中的各种异常
- 结果封装:统一格式化工具输出供LLM使用
多工具协同调用
系统支持复杂的多工具协同调用场景,Agent能够根据任务需求自动组合多个工具:
# 示例:知识库搜索与互联网搜索的组合
def complex_query_processing(user_query: str):
# 首先在本地知识库中搜索
local_results = search_local_knowledgebase(
database="technical_docs",
query=user_query
)
# 如果本地结果不足,进行互联网搜索
if not local_results or len(local_results.data["docs"]) < 3:
internet_results = search_internet(query=user_query)
return combine_results(local_results, internet_results)
return local_results
这种机制使得 Langchain-Chatchat 能够处理复杂的多步骤任务,如研究分析、数据查询、内容生成等,大大扩展了大语言模型的实际应用能力。
通过这套自动工具调用与参数解析机制,Langchain-Chatchat 实现了真正意义上的智能工具使用,让大语言模型不仅能够理解用户意图,还能通过合适的工具高效完成任务。
ChatGLM3和Qwen的Agent优化
Langchain-Chatchat针对ChatGLM3和Qwen大语言模型进行了深度Agent优化,通过定制化的提示工程、输出解析器改进和工具调用机制,显著提升了Agent的任务执行能力和稳定性。
模型特化提示工程
针对Qwen模型的特性,项目实现了专门的提示模板系统。QwenChatAgentPromptTemplate类负责格式化工具描述和任务上下文,确保模型能够准确理解可用工具的功能和调用方式:
class QwenChatAgentPromptTemplate(BaseChatPromptTemplate):
template: str
tools: List[BaseTool]
def format_messages(self, **kwargs) -> str:
# 格式化工具描述
tools = []
for t in self.tools:
desc = re.sub(r"\n+", " ", t.description)
text = f"{t.name}: Call this tool to interact with the {t.name} API. What is the {t.name} API useful for? {desc} Parameters: {t.args}"
tools.append(text)
kwargs["tools"] = "\n\n".join(tools)
kwargs["tool_names"] = ", ".join([tool.name for tool in self.tools])
formatted = self.template.format(**kwargs)
return [HumanMessage(content=formatted)]
智能输出解析器优化
针对Qwen模型输出格式的特殊性,项目实现了QwenChatAgentOutputParserCustom解析器,具备强大的格式容错能力:
解析器能够自动处理以下常见问题:
- JSON键值使用单引号而非双引号
- JSON字符串缺少结束引号和括号
- 输出中包含注释内容
- 参数键名不一致(如command vs query)
流式处理兼容性优化
针对Qwen模型在流式模式下工具调用的问题,项目实现了特殊的处理机制:
def _plan_without_stream(self, intermediate_steps, callbacks=None, **kwargs):
"""非流式模式下的计划执行"""
inputs = {**kwargs, **{"intermediate_steps": intermediate_steps}}
return self.runnable.invoke(inputs, config={"callbacks": callbacks})
async def _aplan_without_stream(self, intermediate_steps, callbacks=None, **kwargs):
"""异步非流式模式下的计划执行"""
inputs = {**kwargs, **{"intermediate_steps": intermediate_steps}}
return await self.runnable.ainvoke(inputs, config={"callbacks": callbacks})
多模型配置支持
项目支持灵活的模型配置,针对不同任务阶段使用不同的模型参数:
| 模型阶段 | 温度参数 | 最大令牌数 | 历史长度 | 提示模板 |
|---|---|---|---|---|
| 预处理模型 | 0.4 | 2048 | 100 | default |
| 主语言模型 | 0.9 | 4096 | 3 | default |
| 动作模型 | 0.01 | 4096 | - | qwen |
| 后处理模型 | 0.01 | 4096 | - | default |
model_config = {
"preprocess_model": {"qwen": {"temperature": 0.4, "max_tokens": 2048}},
"llm_model": {"qwen": {"temperature": 0.9, "max_tokens": 4096}},
"action_model": {"qwen": {"temperature": 0.01, "max_tokens": 4096, "prompt_name": "qwen"}},
"postprocess_model": {"qwen": {"temperature": 0.01, "max_tokens": 4096}}
}
工具调用性能优化
通过工具注册表机制,Qwen Agent能够动态加载和调用各种工具:
优化后的Qwen Agent在以下场景表现优异:
- 天气查询和地理位置服务
- 知识库检索和文档处理
- 数学计算和数据分析
- 网络搜索和信息获取
- 图像生成和多媒体处理
错误处理和重试机制
项目实现了完善的错误处理机制,确保Agent在遇到异常时能够优雅降级:
class QwenChatAgentOutputParserCustom(StructuredChatOutputParser):
def parse(self, text: str) -> Union[AgentAction, AgentFinish]:
try:
# 尝试解析标准格式
if s := re.findall(r"\nAction:\s*(.+)\nAction\sInput:\s*(.+)", text, flags=re.DOTALL):
# 处理解析逻辑
return AgentAction(...)
else:
# 降级处理,直接返回文本作为最终答案
return AgentFinish({"
更多推荐




所有评论(0)