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(灵活组合)
LangChain案例:搭建本地知识智能客服
AI Agent设计
AGENT_TMPL = """按照给定的格式回答以下问题。你可以使用下面这些工具:{tools}回答时需要遵循以下用---括起来的格式:---Question: 我需要回答的问题Thought: 回答这个上述我需要做些什么Action: "{tool_names}" 中的一个工具名Action Input: 选择这个工具所需要的输入Observation: 选择这个工具返回的结果...(这个 思考/行动/行动输入/观察 可以重复N次)Thought: 我现在知道最终答案Final Answer: 原始输入问题的最终答案---现在开始回答,记得在给出最终答案前,需要按照指定格式进行一步一步的推理。Question: {input}{agent_scratchpad}"""
这个模版中,最重要的是:
Thought
Action
Action Input
这3个部分是 AI 在Chain中进行自我思考的过程
可用Cursor帮写部分代码:代码是LangChain模拟调用**functionCall,**完整代码如下
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范式
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 自己认为找到答案了
所以,用户给需求 ,Agent不断思考,调用tool来满足用户需求;注意,也不是找不到问题无限循环下去,这里可以设置一个N(这个思考/行动/行动输入/观察可以重复 N 次)这个N的也不是一个准确的次数,大模型会在N次附近,自己判断。也可能找不到工具还会对用户反问咨询。
LLM选择工具,就是通过LLM的prompt进行提问,来选择的:用户的需求是XXX,我现在有XXX工具,如果需要,我可以选择其中一个工具来执行;(是通过LLM的推理来完成的)
同样功能的function 大模型会自己选择,可以选择的tool很多,但是每次执行可以只用一个适合的
案例:LangChain工具链组合设计
工具链组合设计
在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))
示例1: 文本分析与处理
我需要先分析文本的情感倾向,然后再统计其中的行数。行动: 文本分析行动输入: '这个产品非常好用,我很喜欢它的设计,使用体验非常棒!\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,性价比高
示例2: 数据格式转换
我需要将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))
以上代码工具链式创建过程:
create_tool_chain()
函数负责初始化各工具并组合成一个完整的工具链:
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}
在 LangChain 中,{agent_scratchpad} 是一个重要的占位符变量,用于在智能体(Agent)运行过程中临时存储和传递中间步骤的信息(比如思考过程、工具调用记录等)。它的作用类似于一个“草稿本”
create_react_agent 是 LangChain 中自定义 ReAct 智能体的底层方法。
它允许你自定义提示词(Prompt),并将工具链、推理流程等信息以变量的形式插入到提示词中。
当用 PromptTemplate 创建提示词时,LangChain 会自动把 {tools}、{tool_names} 替换为实际内容。
实现细节
ReAct框架:使用LangChain的ReAct框架,允许代理执行思考-行动-观察的循环:
-
思考:分析任务,确定下一步行动
-
行动:调用适当的工具
-
观察:分析工具返回的结果
-
重复:根据观察结果继续思考,直到任务完成
工具注册与调用:每个工具需要以特定格式注册,包括名称、描述和执行函数:
Tool(
name=tool_instance.name,
func=tool_instance.run,
description=
“工具描述…”
)
**内存与上下文:**系统使用 ConversationBufferMemory
存储对话历史,使代理能够参考之前的交互
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。