微信扫码
添加专属顾问
我要投稿
探索AI Agent的多样化应用与实践,深入了解LangChain等工具的实际案例。 核心内容: 1. AI Agent工作流编排对比分析 2. 工具调用与扩展性功能探讨 3. RAG技术应用及多模态部署策略 4. AI Agent选择指南与实战案例分享
(1)工作流编排
LangChain:线性链,适合固定流程任务(如文档问答)。
LangGraph:支持循环、条件边和状态传递,适合动态调整的复杂逻辑(如多轮决策)。
Coze:可视化工作流,支持嵌套和批处理,但灵活性较低。
dify:基于自然语言定义工作流,适合API集成和Prompt调优。
(2)工具调用与扩展性
LangChain/LangGraph:工具作为链或图的节点,支持自定义工具和重试逻辑。
Coze:依赖预置插件生态,扩展需通过开放平台。
Dify:支持OpenAPI集成,适合技术栈复杂的场景。
(3)RAG(检索增强生成)
LangChain:开箱即用的文档加载、向量检索功能。
LangGraph:需手动设计RAG节点,但支持反馈循环优化检索质量。
Dify/Coze:Dify提供基础RAG支持,Coze依赖知识库管理。
(4)多模态与部署
Coze:支持图像、视频生成,可直接发布至社交平台。
Qwen-Agent:开源架构,支持三级索引,以及工具调用,MCP协议调用,使用方便。
Dify:专注私有化部署,适合企业内网。
AI Agent选择建议:
• 无代码开发: Coze
• 快速原型开发:LangChain(线性任务)或 Qwen-Agent。
• 复杂Agent系统:LangGraph(多Agent协作)或 Dify(API深度集成)。
• 企业私有化:Dify(开源部署),Qwen-Agent 或 LangChain+LangGraph(灵活组合)
AGENT_TMPL = """按照给定的格式回答以下问题。你可以使用下面这些工具:{tools}回答时需要遵循以下用---括起来的格式:---Question: 我需要回答的问题Thought: 回答这个上述我需要做些什么Action: "{tool_names}" 中的一个工具名Action Input: 选择这个工具所需要的输入Observation: 选择这个工具返回的结果...(这个 思考/行动/行动输入/观察 可以重复N次)Thought: 我现在知道最终答案Final Answer: 原始输入问题的最终答案---现在开始回答,记得在给出最终答案前,需要按照指定格式进行一步一步的推理。Question: {input}{agent_scratchpad}"""
import reimport osfrom typing import List, Union# Python内置模块,用于格式化和包装文本import textwrapimport timefrom langchain.agents import ( Tool, # 可用工具 AgentExecutor, # Agent执行 LLMSingleActionAgent, # 定义Agent AgentOutputParser, # 输出结果解析)from langchain.prompts import StringPromptTemplate# LLMChain,包含一个PromptTemplate和一个LLMfrom langchain_community.llms import Tongyi # 导入通义千问Tongyi模型from langchain import LLMChain# Agent执行,Agent结束from langchain.schema import AgentAction, AgentFinish# PromptTemplate: 管理LLMs的Promptsfrom langchain.prompts import PromptTemplatefrom langchain.llms.base import BaseLLM# 定义了LLM的Prompt TemplateCONTEXT_QA_TMPL = """根据以下提供的信息,回答用户的问题信息:{context}问题:{query}"""CONTEXT_QA_PROMPT = PromptTemplate( input_variables=["query", "context"], template=CONTEXT_QA_TMPL,)# 输出结果显示,每行最多60字符,每个字符显示停留0.1秒(动态显示效果)def output_response(response: str) -> None: if not response: exit(0) # 每行最多60个字符 for line in textwrap.wrap(response, width=60): for word in line.split(): for char in word: print(char, end="", flush=True) time.sleep(0.1) # Add a delay of 0.1 seconds between each character print(" ", end="", flush=True) # Add a space between each word print() # Move to the next line after each line is printed # 遇到这里,这个问题的回答就结束了 print("----------------------------------------------------------------")# 模拟公司产品和公司介绍的数据源class TeslaDataSource: def __init__(self, llm: BaseLLM): self.llm = llm # 工具1:产品描述 def find_product_description(self, product_name: str) -> str: """模拟公司产品的数据库""" product_info = { "Model 3": "具有简洁、动感的外观设计,流线型车身和现代化前脸。定价23.19-33.19万", "Model Y": "在外观上与Model 3相似,但采用了更高的车身和更大的后备箱空间。定价26.39-36.39万", "Model X": "拥有独特的翅子门设计和更加大胆的外观风格。定价89.89-105.89万", } # 基于产品名称 => 产品描述 return product_info.get(product_name, "没有找到这个产品") # 工具2:公司介绍 def find_company_info(self, query: str) -> str: """模拟公司介绍文档数据库,让llm根据信息回答问题""" context = """ 特斯拉最知名的产品是电动汽车,其中包括Model S、Model 3、Model X和Model Y等多款车型。 特斯拉以其技术创新、高性能和领先的自动驾驶技术而闻名。公司不断推动自动驾驶技术的研发,并在车辆中引入了各种驾驶辅助功能,如自动紧急制动、自适应巡航控制和车道保持辅助等。 """ # prompt模板 = 上下文context + 用户的query prompt = CONTEXT_QA_PROMPT.format(query=query, context=context) # 使用LLM进行推理 return self.llm(prompt)AGENT_TMPL = """按照给定的格式回答以下问题。你可以使用下面这些工具:{tools}回答时需要遵循以下用---括起来的格式:---Question: 我需要回答的问题Thought: 回答这个上述我需要做些什么Action: "{tool_names}" 中的一个工具名Action Input: 选择这个工具所需要的输入Observation: 选择这个工具返回的结果...(这个 思考/行动/行动输入/观察 可以重复N次)Thought: 我现在知道最终答案Final Answer: 原始输入问题的最终答案---现在开始回答,记得在给出最终答案前,需要按照指定格式进行一步一步的推理。Question: {input}{agent_scratchpad}"""class CustomPromptTemplate(StringPromptTemplate): template: str # 标准模板 tools: List[Tool] # 可使用工具集合 def format(self, **kwargs) -> str: """ 按照定义的 template,将需要的值都填写进去。 Returns: str: 填充好后的 template。 """ # 取出中间步骤并进行执行 intermediate_steps = kwargs.pop("intermediate_steps") print('intermediate_steps=', intermediate_steps) print('='*30) thoughts = "" for action, observation in intermediate_steps: thoughts += action.log thoughts += f"\nObservation: {observation}\nThought: " # 记录下当前想法 => 赋值给agent_scratchpad kwargs["agent_scratchpad"] = thoughts # 枚举所有可使用的工具名+工具描述 kwargs["tools"] = "\n".join( [f"{tool.name}: {tool.description}" for tool in self.tools] ) # 枚举所有的工具名称 kwargs["tool_names"] = ", ".join( [tool.name for tool in self.tools] ) cur_prompt = self.template.format(**kwargs) #print(cur_prompt) return cur_prompt""" 对Agent返回结果进行解析,有两种可能: 1)还在思考中 AgentAction 2)找到了答案 AgentFinal"""class CustomOutputParser(AgentOutputParser): def parse(self, llm_output: str) -> Union[AgentAction, AgentFinish]: """ 解析 llm 的输出,根据输出文本找到需要执行的决策。 Args: llm_output (str): _description_ Raises: ValueError: _description_ Returns: Union[AgentAction, AgentFinish]: _description_ """ # 如果句子中包含 Final Answer 则代表已经完成 if "Final Answer:" in llm_output: return AgentFinish( return_values={"output": llm_output.split("Final Answer:")[-1].strip()}, log=llm_output, ) # 需要进行 AgentAction regex = r"Action\s*\d*\s*:(.*?)\nAction\s*\d*\s*Input\s*\d*\s*:[\s]*(.*)" # 解析 action_input 和 action match = re.search(regex, llm_output, re.DOTALL) if not match: raise ValueError(f"Could not parse LLM output: `{llm_output}`") action = match.group(1).strip() action_input = match.group(2) # Agent执行 return AgentAction( tool=action, tool_input=action_input.strip(" ").strip('"'), log=llm_output )# 设置通义千问API密钥DASHSCOPE_API_KEY = os.getenv("DASHSCOPE_API_KEY")if __name__ == "__main__": # 定义LLM llm = Tongyi(model_name="qwen-turbo", dashscope_api_key=DASHSCOPE_API_KEY) # 使用通义千问qwen-turbo模型 # 自有数据 tesla_data_source = TeslaDataSource(llm) # 定义的Tools tools = [ Tool( name="查询产品名称", func=tesla_data_source.find_product_description, description="通过产品名称找到产品描述时用的工具,输入的是产品名称", ), Tool( name="公司相关信息", func=tesla_data_source.find_company_info, description="当用户询问公司相关的问题,可以通过这个工具了解公司信息", ), ] # 用户定义的模板 agent_prompt = CustomPromptTemplate( template=AGENT_TMPL, tools=tools, input_variables=["input", "intermediate_steps"], ) # Agent返回结果解析 output_parser = CustomOutputParser() # 最常用的Chain, 由LLM + PromptTemplate组成 llm_chain = LLMChain(llm=llm, prompt=agent_prompt) # 定义的工具名称 tool_names = [tool.name for tool in tools] # 定义Agent = llm_chain + output_parser + tools_names agent = LLMSingleActionAgent( llm_chain=llm_chain, output_parser=output_parser, stop=["\nObservation:"], allowed_tools=tool_names, ) # 定义Agent执行器 = Agent + Tools agent_executor = AgentExecutor.from_agent_and_tools( agent=agent, tools=tools, verbose=True ) # 主过程:可以一直提问下去,直到Ctrl+C while True: try: user_input = input("请输入您的问题:") response = agent_executor.run(user_input) output_response(response) except KeyboardInterrupt: break
Model Y 在外观上与 Model 3 相似,但采用了更高的车身和更大的后备箱空间。其定价范围为 26.39 万至 36.39 万。
可见,这个prompt中,最重要的是:
Thought--->Action--->Action Input
可以重复N次,直到
Thought: 我现在知道最终答案
Final Answer: 原始输入问题的最终答案
# 定义LLM llm = Tongyi(model_name="qwen-turbo", dashscope_api_key=DASHSCOPE_API_KEY) # 使用通义千问qwen-turbo模型 # 自有数据 tesla_data_source = TeslaDataSource(llm) # 定义的Tools tools = [ Tool( name="查询产品名称", func=tesla_data_source.find_product_description, description="通过产品名称找到产品描述时用的工具,输入的是产品名称", ), Tool( name="公司相关信息", func=tesla_data_source.find_company_info, description="当用户询问公司相关的问题,可以通过这个工具了解公司信息", ), ]
让LLM能使用tools,按照规定的prompt执行
在这个prompt中,不断的:
Thought => Action, Action Input => Observation
直到
Thought: 我现在知道最终答案
Final Answer: 原始输入问题的最终答案
整个模拟搭建一个本地知识智能客服代码详细见上文
当然如果提问的问题比较简单或者无法用工具回答,则不会调用工具。
Agent是智能体,我们会给Agent配置各种tool, memory, prompt, LLM
LLM是Agent的大脑,Agent如果要决定使用哪个工具,是通过LLM来进行推理。tools在langchain中,你可以自己定义自己的tool,也可以使用langchain已经集成好的tool。用户的query + tools 的 description , 来决定使用哪个Tool。LLM通常回答问题,会把memory(上下文)放进去,这个会消耗更多的token。
参考:http://reverie.herokuapp.com/arXiv_Demo/#
ReAct: Synergizing Reasoning and Acting in Language Models, 2022 https://arxiv.org/abs/2210.03629
将推理和动作相结合,克服LLM胡言乱语的问题,同时提高了结果的可解释性和可信赖度
人们在从事一项需要多个步骤的任务时,在步骤和步骤之间,或者动作和动作之间,一般都会有推理过程。
上图是三种QA,Question:除了苹果遥控器,还有什么设备能解决苹果遥控器最早设计交互的控制问题?
可以看到纯思维链CoT和纯Act行动都不行。CoT 存在事实幻觉的问题。
ReAct 的结构性约束降低了它在制定推理步骤方面的灵活性。
ReAct 在很大程度上依赖于它正在检索的信息。
ReAct = Reason + Act
Apple遥控器最早只能控制Front Row软件。Front Row软件可以被两种设备控制,Apple遥控器和键盘的功能键。所以,正确答案是键盘的功能键。
ReAct这个方式,简单有效,可解释性强
机器把想法写出来,然后结合想法和观察,做出相应的动作
Though: …
Action: …
Observation: …
• Agent 的核心是把 LLM 当作推理引擎,让它能使用外部工具,以及自己的长期记忆,从而完成灵活的决策步骤,进行复杂任务
• LangChain 里的 Chain 的概念,是由人来定义的一套流程步骤来让 LLM 执行,可以看成是把LLM 当成了一个强大的多任务工具
典型的 Agent 逻辑(比如 ReAct):
• 由 LLM 选择工具。
• 执行工具后,将输出结果返回给 LLM
• 不断重复上述过程,直到达到停止条件,通常是 LLM 自己认为找到答案了
同样功能的function 大模型会自己选择,可以选择的tool很多,但是每次执行可以只用一个适合的
工具链组合设计
在Agent系统中,工具链是实现复杂任务的关键组件。通过将多个工具组合,Agent可以逐步处理复杂的问题。
示例:LangChain中的工具加载与组合
import osfrom langchain.agents import load_toolsfrom langchain.llms import OpenAIllm = Tongyi(model_name="qwen-turbo", dashscope_api_key=DASHSCOPE_API_KEY)tools = load_tools(["serpapi", "llm-math"], llm=llm)
这里加载了搜索引擎工具(serpapi)和数学计算工具(llm-math),并将其与语言模型(LLM)组合使用,以处理需要搜索和计算的任务
工具链组合设计
通过组合三个工具来解决复杂任务,包括:
• 文本分析工具 (TextAnalysisTool):负责分析文本内容,提取统计信息和情感倾向。
• 数据转换工具 (DataConversionTool):实现不同数据格式之间的转换,目前支持JSON和CSV格式互转。
• 文本处理工具 (TextProcessingTool):提供文本处理功能,如统计行数、查找文本和替换文本。
测试用例:
1、分析以下文本的情感倾向,并统计其中的行数:'这个产品非常好用,我很喜欢它的设计,使用体验非常棒!\n价格也很合理,推荐大家购买。\n客服态度也很好,解答问题很及时。’
2、将以下CSV数据转换为JSON格式:'name,age,comment\n张三,25,这个产品很好\n李四,30,服务态度差\n王五,28,性价比高’
3、分析以下文本,找出所有包含'好'的行,然后将结果转换为JSON格式:'产品A:质量好,价格合理\n产品B:外观好,但价格贵\n产品C:性价比好,推荐购买'
Step1, 用户提交任务描述
Step2, Agent分析任务,决定使用哪些工具
Step3, Agent通过ReAct框架调用相应工具
Step4, 系统整合各工具结果,生成最终回答
# 示例用法if __name__ == "__main__": # 示例1: 文本分析与处理 task1 = "分析以下文本的情感倾向,并统计其中的行数:'这个产品非常好用,我很喜欢它的设计,使用体验非常棒!\n价格也很合理,推荐大家购买。\n客服态度也很好,解答问题很及时。'" print("任务1:", task1) print("结果:", process_task(task1)) # 示例2: 数据格式转换 task2 = "将以下CSV数据转换为JSON格式:'name,age,comment\n张三,25,这个产品很好\n李四,30,服务态度差\n王五,28,性价比高'" print("\n任务2:", task2) print("结果:", process_task(task2))
我需要先分析文本的情感倾向,然后再统计其中的行数。
行动: 文本分析
行动输入: '这个产品非常好用,我很喜欢它的设计,使用体验非常棒!\n价格也很合理,推荐大家购买。\n客服态度也很好,解答问题很及时。'
观察: {'word_count': 35, 'char_count': 102, 'sentiment': '正面'}
思考: 我已经得到了情感倾向,接下来需要统计行数。
行动: 文本处理
行动输入: operation='count_lines', content='这个产品非常好用,我很喜欢它的设计,使用体验非常棒!\n价格也很合理,推荐大家购买。\n客服态度也很好,解答问题很及时。'
观察: {'line_count': 3}
思考: 我现在已经有了最终答案。
回答: 该文本的情感倾向为正面,其中包含3行内容。`
For troubleshooting, visit: https://python.langchain.com/docs/troubleshooting/errors/OUTPUT_PARSING_FAILURE
任务2: 将以下CSV数据转换为JSON格式:'name,age,comment
张三,25,这个产品很好
李四,30,服务态度差
王五,28,性价比高
我需要将CSV格式的数据转换为JSON格式,可以使用数据转换工具来完成这个任务。行动: 数据转换行动输入: input_data='name,age,comment\n张三,25,这个产品很好\n李四,30,服务态度差\n王五,28,性价比高', input_format='csv', output_format='json'观察: [{"name": "\u5f20\u4e09", "age": "25", "comment": "\u8fd9\u4e2a\u4ea7\u54c1\u5f88\u597d"}, {"name": "\u674e\u56db", "age": "30", "comment": "\u670d\u52a1\u6001\u5ea6\u5dee"}, {"name": "\u738b\u4e94", "age": "28", "comment": "\u6027\u4ef7\u6bd4\u9ad8"}]思考: 我现在已经有了最终答案回答: 以下是从CSV格式转换为JSON格式的数据:[ {"name": "张三", "age": "25", "comment": "这个产品很好"}, {"name": "李四", "age": "30", "comment": "服务态度差"}, {"name": "王五", "age": "28", "comment": "性价比高"}]
from langchain.agents import Tool, AgentExecutor, create_react_agentfrom langchain.prompts import PromptTemplatefrom langchain.schema import AgentAction, AgentFinishfrom langchain_community.llms import Tongyifrom langchain.memory import ConversationBufferMemoryimport reimport jsonfrom typing import List, Union, Dict, Anyimport os# 设置通义千问API密钥DASHSCOPE_API_KEY = os.getenv("DASHSCOPE_API_KEY")# 自定义工具1:文本分析工具class TextAnalysisTool: """文本分析工具,用于分析文本内容""" def __init__(self): self.name = "文本分析" self.description = "分析文本内容,提取字数、字符数和情感倾向" def run(self, text: str) -> str: """分析文本内容 参数: text: 要分析的文本 返回: 分析结果 """ # 简单的文本分析示例 word_count = len(text.split()) char_count = len(text) # 简单的情感分析(示例) positive_words = ["好", "优秀", "喜欢", "快乐", "成功", "美好"] negative_words = ["差", "糟糕", "讨厌", "悲伤", "失败", "痛苦"] positive_count = sum(1 for word in positive_words if word in text) negative_count = sum(1 for word in negative_words if word in text) sentiment = "积极" if positive_count > negative_count else "消极" if negative_count > positive_count else "中性" return f"文本分析结果:\n- 字数: {word_count}\n- 字符数: {char_count}\n- 情感倾向: {sentiment}"# 自定义工具2:数据转换工具class DataConversionTool: """数据转换工具,用于在不同格式之间转换数据""" def __init__(self): self.name = "数据转换" self.description = "在不同数据格式之间转换,如JSON、CSV等" def run(self, input_data: str, input_format: str, output_format: str) -> str: """转换数据格式 参数: input_data: 输入数据 input_format: 输入格式 output_format: 输出格式 返回: 转换后的数据 """ try: if input_format.lower() == "json" and output_format.lower() == "csv": # JSON到CSV的转换示例 data = json.loads(input_data) if isinstance(data, list): if not data: return "空数据" # 获取所有可能的列 headers = set() for item in data: headers.update(item.keys()) headers = list(headers) # 创建CSV csv = ",".join(headers) + "\n" for item in data: row = [str(item.get(header, "")) for header in headers] csv += ",".join(row) + "\n" return csv else: return "输入数据必须是JSON数组" elif input_format.lower() == "csv" and output_format.lower() == "json": # CSV到JSON的转换示例 lines = input_data.strip().split("\n") if len(lines) < 2: return "CSV数据至少需要标题行和数据行" headers = lines[0].split(",") result = [] for line in lines[1:]: values = line.split(",") if len(values) != len(headers): continue item = {} for i, header in enumerate(headers): item[header] = values[i] result.append(item) return json.dumps(result, ensure_ascii=False, indent=2) else: return f"不支持的转换: {input_format} -> {output_format}" except Exception as e: return f"转换失败: {str(e)}"# 自定义工具3:文本处理工具class TextProcessingTool: """文本处理工具,用于处理文本内容""" def __init__(self): self.name = "文本处理" self.description = "处理文本内容,如查找、替换、统计等" def run(self, operation: str, content: str, **kwargs) -> str: """处理文本内容 参数: operation: 操作类型 content: 文本内容 **kwargs: 其他参数 返回: 处理结果 """ if operation == "count_lines": return f"文本共有 {len(content.splitlines())} 行" elif operation == "find_text": search_text = kwargs.get("search_text", "") if not search_text: return "请提供要查找的文本" lines = content.splitlines() matches = [] for i, line in enumerate(lines): if search_text in line: matches.append(f"第 {i+1} 行: {line}") if matches: return f"找到 {len(matches)} 处匹配:\n" + "\n".join(matches) else: return f"未找到文本 '{search_text}'" elif operation == "replace_text": old_text = kwargs.get("old_text", "") new_text = kwargs.get("new_text", "") if not old_text: return "请提供要替换的文本" new_content = content.replace(old_text, new_text) count = content.count(old_text) return f"替换完成,共替换 {count} 处。\n新内容:\n{new_content}" else: return f"不支持的操作: {operation}"# 创建工具链def create_tool_chain(): """创建工具链""" # 创建工具 text_analysis = TextAnalysisTool() data_conversion = DataConversionTool() text_processing = TextProcessingTool() # 组合工具 tools = [ Tool( name=text_analysis.name, func=text_analysis.run, description="分析文本内容,提取字数、字符数和情感倾向" ), Tool( name=data_conversion.name, func=data_conversion.run, description="在不同数据格式之间转换,如JSON、CSV等" ), Tool( name=text_processing.name, func=text_processing.run, description="处理文本内容,如查找、替换、统计等" ) ] # 初始化语言模型 llm = Tongyi(model_name="qwen-turbo-latest", dashscope_api_key=DASHSCOPE_API_KEY) # 创建提示模板 prompt = PromptTemplate.from_template( """你是一个有用的AI助手,可以使用以下工具:{tools}可用工具名称: {tool_names}使用以下格式:问题: 你需要回答的问题思考: 你应该始终思考要做什么行动: 要使用的工具名称,必须是 [{tool_names}] 中的一个行动输入: 工具的输入观察: 工具的结果... (这个思考/行动/行动输入/观察可以重复 N 次)思考: 我现在已经有了最终答案回答: 对原始问题的最终回答开始!问题: {input}思考: {agent_scratchpad}""" ) # 创建Agent agent = create_react_agent(llm, tools, prompt) # 创建Agent执行器 agent_executor = AgentExecutor.from_agent_and_tools( agent=agent, tools=tools, memory=ConversationBufferMemory(memory_key="chat_history"), verbose=True, handle_parsing_errors=False # 关闭自动重试, True会严格检查重试 ) return agent_executor# 示例:使用工具链处理任务def process_task(task_description): """ 使用工具链处理任务 参数: task_description: 任务描述 返回: 处理结果 """ try: agent_executor = create_tool_chain() response = agent_executor.invoke({"input": task_description}) return response["output"] # 从返回的字典中提取输出 except Exception as e: return f"处理任务时出错: {str(e)}"# 示例用法if __name__ == "__main__": # 示例1: 文本分析与处理 task1 = "分析以下文本的情感倾向,并统计其中的行数:'这个产品非常好用,我很喜欢它的设计,使用体验非常棒!\n价格也很合理,推荐大家购买。\n客服态度也很好,解答问题很及时。'" print("任务1:", task1) print("结果:", process_task(task1)) # 示例2: 数据格式转换 task2 = "将以下CSV数据转换为JSON格式:'name,age,comment\n张三,25,这个产品很好\n李四,30,服务态度差\n王五,28,性价比高'" print("\n任务2:", task2) print("结果:", process_task(task2))
def create_tool_chain(): # 创建工具实例 text_analysis = TextAnalysisTool() data_conversion = DataConversionTool() text_processing = TextProcessingTool() # 将工具包装为LangChain工具格式 tools = [Tool(...), Tool(...), Tool(...)] # 初始化语言模型 llm = Tongyi(model_name="qwen-turbo", dashscope_api_key=DASHSCOPE_API_KEY) # 创建提示模板 prompt = PromptTemplate.from_template(...) # 创建代理 agent = create_react_agent(llm, tools, prompt) # 创建代理执行器 agent_executor = AgentExecutor.from_agent_and_tools(...) return agent_executor
你是一个有用的AI助手,可以使用以下工具:
{tools}
可用工具名称: {tool_names}
使用以下格式:
问题: 你需要回答的问题
思考: 你应该始终思考要做什么
行动: 要使用的工具名称
行动输入: 工具的输入
观察: 工具的结果
... (这个思考/行动/行动输入/观察可以重复多次)
回答: 对原始问题的最终回答
开始!
问题: {input}
思考: {agent_scratchpad}
create_react_agent 是 LangChain 中自定义 ReAct 智能体的底层方法。
它允许你自定义提示词(Prompt),并将工具链、推理流程等信息以变量的形式插入到提示词中。
当用 PromptTemplate 创建提示词时,LangChain 会自动把 {tools}、{tool_names} 替换为实际内容。
ReAct框架:使用LangChain的ReAct框架,允许代理执行思考-行动-观察的循环:
1. 思考:分析任务,确定下一步行动
2. 行动:调用适当的工具
3. 观察:分析工具返回的结果
4. 重复:根据观察结果继续思考,直到任务完成
工具注册与调用:每个工具需要以特定格式注册,包括名称、描述和执行函数:
Tool(
name=tool_instance.name,
func=tool_instance.run,
description=
"工具描述..."
)
内存与上下文:系统使用 `ConversationBufferMemory` 存储对话历史,使代理能够参考之前的交互
memory=ConversationBufferMemory(memory_key="chat_history"
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-05-31
吴恩达:别再纠结Agent定义,AI Agent开发者应关注这些要点
2025-05-30
使用 LangChain 与 MCP集成
2025-05-30
基于Langchain框架的Agent智能体实现之工具集成
2025-05-28
AI Agent框架哪家强:Google ADK、Autogen、Langchain与CrewAI
2025-05-28
彻底说清 Human-in-the-Loop:企业级 Agent 系统的关键挑战与LangGraph解法【上】
2025-05-27
Langchain创始人最新分享:如何跨越“原型惊艳”到“生产可靠”的鸿沟
2025-05-26
简单实战LangChain多任务应用开发
2025-05-26
二、LangChain提示词工程
2024-10-10
2024-07-13
2024-06-03
2024-04-08
2024-09-04
2024-04-08
2024-08-18
2024-03-28
2024-06-24
2024-07-10
2025-05-21
2025-05-19
2025-05-08
2025-05-06
2025-04-22
2025-04-18
2025-03-22
2025-03-22