在掌握 LangChain 基础使用后单纯的内置 Chain 往往无法满足复杂业务场景如多步骤文本处理、工具自主调用。本文将基于阿里通义千问模型国内开发者友好、无需科学上网聚焦自定义 Chain 和智能 Agent 开发从原理到代码手把手教你搭建可适配复杂任务的 LLM 应用解决实际开发中“链路不灵活”“无法自主决策”的核心痛点。一、核心背景为什么需要自定义 Chain/AgentLangChain 内置的基础 Chain如 LLMChain仅能完成“输入→单次调用 LLM→输出”的简单流程而实际业务中复杂任务需要多步骤链路如“用户提问→关键词提取→内容生成→格式校验”部分任务需要 LLM自主判断是否调用工具如计算、搜索、数据库查询自定义 Chain 可串联多步骤逻辑Agent 则赋予 LLM “决策能力”两者结合能覆盖 80% 以上的复杂业务场景。本文全程使用阿里通义千问Qwen模型适配国内开发环境无需依赖 OpenAI。二、前置准备环境配置与依赖安装2.1 安装核心依赖如已安装则忽略跳过这一步# 安装LangChain核心库 pip install langchain # 安装阿里千问适配库LangChain对接千问的核心依赖 pip install langchain-community # 安装通义千问SDK pip install dashscope2.2 获取通义千问API Key进入“API-KEY管理”页面创建并复制你的API Key访问阿里云百炼控制台完成实名认证将复制的API Key直接替换代码中“你的通义千问API Key”即可。三、实战1自定义 SequentialChain 实现多步骤文本处理3.1 核心思路SequentialChain 允许将多个基础 Chain 串联前一个 Chain 的输出作为后一个 Chain 的输入实现“流水线式”文本处理。本次实战基于千问模型实现用户输入问题 → 提取核心关键词 → 生成专业回答 → 格式化输出。3.2 完整代码实现import os from langchain_community.chat_models import ChatTongyi from langchain_core.prompts import ChatPromptTemplate from langchain_classic.chains import LLMChain, SequentialChain # 1. 初始化阿里千问模型支持Qwen-14B-Chat、Qwen-7B-Chat等 # 直接写死API Key替换为你的通义千问API Key即可 llm ChatTongyi( modelqwen-turbo, # 基础版可选qwen-7b-chat效果更好选qwen-plus temperature0.6, # 0-1值越低回答越固定越高越灵活 api_key你的apikey # 直接写死API Key ) # 2. 定义第一步Chain提取用户问题的核心关键词 prompt1 ChatPromptTemplate.from_messages([ (system, 你是关键词提取专家仅提取用户问题中的核心技术关键词用英文逗号分隔不添加任何额外解释。), (human, 用户问题{user_input}) ]) chain1 LLMChain( llmllm, promptprompt1, output_keykeywords # 定义输出键名供后续Chain调用 ) # 3. 定义第二步Chain根据关键词生成专业回答 prompt2 ChatPromptTemplate.from_messages([ (system, 你是资深AI开发工程师针对给定的技术关键词为开发者生成详细、易懂的专业回答结合实际使用场景。), (human, 核心关键词{keywords}) ]) chain2 LLMChain( llmllm, promptprompt2, output_keyraw_answer ) # 4. 定义第三步Chain格式化回答适配CSDN博客风格 prompt3 ChatPromptTemplate.from_messages([ (system, 将输入的技术回答格式化为CSDN博客风格分点说明、重点内容加粗、补充使用注意事项保持专业且易懂。), (human, 原始回答{raw_answer}) ]) chain3 LLMChain( llmllm, promptprompt3, output_keyformatted_answer ) # 5. 串联所有Chain为自定义SequentialChain custom_chain SequentialChain( chains[chain1, chain2, chain3], input_variables[user_input], # 最终输入变量 output_variables[keywords, raw_answer, formatted_answer], # 最终输出变量 verboseTrue # 开启日志便于调试链路执行过程 ) # 6. 运行自定义Chain if __name__ __main__: # 输入示例LangChain如何自定义Agent的工具调用逻辑 result custom_chain.invoke({user_input: LangChain如何自定义Agent的工具调用逻辑}) # 输出结果 print( 提取的核心关键词 ) print(result[keywords]) print(\n 原始回答 ) print(result[raw_answer]) print(\n 格式化后回答CSDN风格) print(result[formatted_answer])3.3 代码关键说明千问模型初始化ChatDashScope是LangChain对接阿里千问的核心类model参数可根据需求选择qwen-7b-chat轻量、qwen-plus效果最优输出键名output_key必须唯一且与后续Chain的输入变量对应是串联多步骤的核心verboseTrue开启后可在控制台看到链路执行的详细日志便于调试每一步的输入输出。四、实战2开发智能Agent实现工具自主调用4.1 核心思路Agent 是 LangChain 中赋予 LLM “决策能力”的核心组件可让千问模型自主判断是否需要调用工具调用哪个工具本次实战实现千问模型结合计算器工具自主处理“带数学运算的问题”。4.2 完整代码实现4.3 代码关键说明工具描述description是 Agent 决策的核心依据描述越精准千问模型调用工具的准确率越高。from langchain_community.chat_models import ChatTongyi from langchain_classic.agents import AgentType, initialize_agent, Tool from langchain_core.prompts import MessagesPlaceholder from langchain_classic.memory import ConversationBufferMemory import math # 1. 初始化千问模型 # 直接写死API Key替换为你的通义千问API Key即可 llm ChatTongyi( modelqwen-turbo, temperature0.5, api_key你的apikey # 直接写死API Key ) # 2. 定义自定义计算器工具 def calculator_tool(query): 执行数学计算 try: # 安全地执行数学计算 result eval(query, {__builtins__: {abs: abs, pow: pow, math: math}}) return f计算结果: {result} except Exception as e: return f计算错误: {str(e)} # 3. 定义工具集可扩展为自定义工具如数据库查询、文件读取 tools [ # 自定义计算器工具 Tool( nameCalculator, # 工具名称需简洁明了 funccalculator_tool, # 工具执行函数 # 工具描述关键决定LLM是否调用该工具需清晰说明适用场景 description用于执行数学计算加减乘除、平方、开方、幂运算等当问题中包含具体的数学运算时调用该工具。 ) ] # 3. 配置Agent记忆可选支持多轮对话 memory ConversationBufferMemory( memory_keychat_history, return_messagesTrue # 返回消息对象适配Chat模型 ) # 4. 初始化Agent适配千问模型的Chat类型Agent agent initialize_agent( toolstools, llmllm, agentAgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION, # 适配Chat模型的Agent类型 verboseTrue, memorymemory, handle_parsing_errorsTrue, # 处理解析错误提升鲁棒性 # 自定义Agent提示可选优化千问模型的决策逻辑 agent_kwargs{ extra_prompt_messages: [MessagesPlaceholder(variable_namechat_history)], } ) # 5. 运行Agent if __name__ __main__: # 测试案例1需要调用计算器 print( 测试案例1调用计算器) result agent.invoke({input: LangChain中10的立方加上25的平方等于多少}) print(result[output]) # 测试案例2无需调用计算器纯文本问题 print(\n 测试案例2不调用计算器) result agent.invoke({input: LangChain的Agent核心原理是什么}) print(result[output])Agent类型选择针对千问这类Chat模型优先选择CHAT_CONVERSATIONAL_REACT_DESCRIPTION适配性更好错误处理handle_parsing_errorsTrue可避免因模型输出格式异常导致Agent崩溃提升生产环境稳定性。五、进阶拓展自定义工具开发5.1 核心思路实际业务中内置工具无法满足需求如查询数据库、读取本地文件可基于 LangChain 自定义工具接入 Agent 体系。5.2 自定义工具代码示例以“本地文件读取”为例六、避坑指南自定义Chain/Agent常见问题千问模型输出格式异常问题Agent 解析千问输出时出现格式错误解决降低模型temperature如0.3或在Prompt中明确要求输出格式如“按JSON格式输出决策步骤”。from langchain.tools import BaseTool from typing import Optional, Type from pydantic import BaseModel, Field from langchain_community.chat_models import ChatDashScope from langchain.agents import AgentType, initialize_agent, Tool from langchain.tools import CalculatorTool from langchain.memory import ConversationBufferMemory # 1. 初始化千问模型直接写死API Key llm ChatDashScope( modelqwen-14b-chat, temperature0.5, api_key你的通义千问API Key # 直接写死API Key ) # 2. 定义工具输入参数模型可选用于参数校验 class ReadFileInput(BaseModel): file_path: str Field(description本地文件的绝对路径如D:/test.txt) # 3. 自定义文件读取工具 class ReadLocalFileTool(BaseTool): name ReadLocalFile description 用于读取本地文本文件的内容当问题中要求读取某个文件内容时调用该工具需传入文件绝对路径。 args_schema: Type[BaseModel] ReadFileInput # 输入参数校验 def _run(self, file_path: str) - str: 同步执行函数核心 try: with open(file_path, r, encodingutf-8) as f: content f.read() return f文件读取成功内容如下\n{content} except Exception as e: return f文件读取失败错误信息{str(e)} async def _arun(self, file_path: str) - str: 异步执行函数可选用于并发场景 return self._run(file_path) # 4. 定义工具集包含内置计算器和自定义文件读取工具 tools [ Tool( nameCalculator, funcCalculatorTool().run, description用于执行数学计算加减乘除、平方、开方、幂运算等当问题中包含具体的数学运算时调用该工具。 ), ReadLocalFileTool() # 加入自定义工具 ] # 5. 配置Agent记忆 memory ConversationBufferMemory( memory_keychat_history, return_messagesTrue ) # 6. 重新初始化Agent并测试 agent initialize_agent( toolstools, llmllm, agentAgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION, verboseTrue, memorymemory, handle_parsing_errorsTrue ) # 测试自定义工具 agent.run(帮我读取D:/langchain_demo.txt这个文件的内容)Chain链路参数不匹配问题前一个Chain的output_key与后一个Chain的输入变量不一致解决严格保证output_key和输入变量名称一致开启verboseTrue调试。Agent不调用工具/错误调用工具问题千问模型未识别出需要调用工具解决优化工具description明确适用场景如“当问题包含数学运算时必须调用Calculator工具”。API调用限额/超时问题阿里千问API调用超出限额或超时解决在代码中添加重试机制如tenacity库或降低模型调用频率。总结基于阿里千问模型的自定义SequentialChain可实现多步骤文本处理核心是保证output_key与输入变量的匹配适合复杂的文本流水线任务智能Agent的核心是工具定义与Prompt优化精准的工具description能大幅提升千问模型的决策准确率自定义工具是Agent落地业务的关键通过BaseTool封装业务逻辑可快速扩展Agent的能力边界。本文所有代码均基于阿里千问模型实现适配国内开发环境可直接复制运行。掌握自定义Chain和Agent后你可轻松应对企业级LLM应用的复杂业务场景如智能客服、自动化办公、知识库问答等。