Langchain-Chatchat高级功能:Agent机制与工具调用

【免费下载链接】Langchain-Chatchat Langchain-Chatchat(原Langchain-ChatGLM)基于 Langchain 与 ChatGLM 等语言模型的本地知识库问答 | Langchain-Chatchat (formerly langchain-ChatGLM), local knowledge based LLM (like ChatGLM) QA app with langchain 【免费下载链接】Langchain-Chatchat 项目地址: https://gitcode.com/GitHub_Trending/la/Langchain-Chatchat

Langchain-Chatchat的Agent机制是基于LangChain框架构建的智能代理系统,通过将语言模型与外部工具相结合,使模型能够执行搜索、计算、数据库查询等实际操作。该系统采用分层架构设计和ReAct(Reasoning + Acting)工作模式,需要满足特定的模型支持、工具配置和系统配置要求才能启用。针对ChatGLM3和Qwen等模型进行了深度优化,并提供了完善的手动工具选择与参数配置机制。

Agent功能原理与启用条件

Langchain-Chatchat的Agent机制是基于LangChain框架构建的智能代理系统,它允许大语言模型通过工具调用来扩展其能力,实现更复杂的任务处理。Agent系统通过将语言模型与外部工具相结合,使模型能够执行搜索、计算、数据库查询等实际操作,从而提供更强大的问题解决能力。

Agent核心架构

Langchain-Chatchat的Agent系统采用分层架构设计,主要包括以下几个核心组件:

mermaid

Agent工作原理

Agent的工作流程遵循经典的ReAct(Reasoning + Acting)模式:

  1. 思考(Reasoning):语言模型分析用户输入,确定需要执行的操作
  2. 行动(Acting):选择合适的工具并执行具体操作
  3. 观察(Observation):获取工具执行结果
  4. 循环处理:重复上述步骤直到获得最终答案
# 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的执行流程如下:

mermaid

常见启用问题排查

如果Agent功能无法正常工作,可以检查以下方面:

  1. 模型兼容性:确认使用的模型在SUPPORT_AGENT_MODELS列表中
  2. 工具配置:确保至少一个工具已启用(use: true
  3. 依赖安装:检查所有工具所需的依赖包是否已安装
  4. API密钥:对于需要外部API的工具,确认API密钥配置正确

性能优化建议

为了获得最佳的Agent性能,建议:

  1. 模型选择:优先选择对Agent有特化优化的模型(如ChatGLM3、Qwen系列)
  2. 工具精简:只启用实际需要的工具,减少不必要的工具调用
  3. 超时配置:根据网络状况适当调整HTTP请求超时时间
  4. 缓存策略:对频繁使用的工具结果实施缓存机制

通过正确配置和优化,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)

工具注册过程包含以下关键步骤:

  1. 元数据自动提取:自动从函数文档字符串中提取工具描述
  2. 标题生成:根据函数名自动生成人类可读的标题
  3. 全局注册:将工具添加到 _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()

参数解析流程如下:

mermaid

结构化输出处理

系统通过 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字符串 结构化数据返回
自定义格式化 通过回调函数自定义输出格式 特殊格式需求
字符串格式 直接转换为字符串 简单文本输出

工具调用执行流程

自动工具调用的完整执行流程涉及多个组件的协同工作:

mermaid

参数验证与错误处理

系统内置了完善的参数验证机制,确保工具调用的安全性和稳定性:

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

错误处理策略包括:

  1. 类型验证:确保参数类型符合工具要求
  2. 格式转换:自动将字符串参数转换为合适的数据结构
  3. 异常捕获:优雅处理工具执行过程中的各种异常
  4. 结果封装:统一格式化工具输出供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解析器,具备强大的格式容错能力:

mermaid

解析器能够自动处理以下常见问题:

  • 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能够动态加载和调用各种工具:

mermaid

优化后的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({"

【免费下载链接】Langchain-Chatchat Langchain-Chatchat(原Langchain-ChatGLM)基于 Langchain 与 ChatGLM 等语言模型的本地知识库问答 | Langchain-Chatchat (formerly langchain-ChatGLM), local knowledge based LLM (like ChatGLM) QA app with langchain 【免费下载链接】Langchain-Chatchat 项目地址: https://gitcode.com/GitHub_Trending/la/Langchain-Chatchat

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐