news 2026/4/18 7:02:08

lanchain高级

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
lanchain高级

ReAct范式

ReAct范式是一种用于增强人工智能模型的推理能力的框架,结合了反应(Reaction)和行动(Action)。它主要通过让模型在处理复杂问题时,能够生成更为详细和准确的响应。ReAct方法通常涉及以下几个步骤:

  • 反应:模型首先根据输入信息做出初步反应,提出相关的问题或反馈。这一阶段强调快速反应和对情境的理解。

  • 行动:基于初步反应,模型进行更深入的分析,可能包括查找信息、推理或者生成进一步的内容。这一阶段注重逻辑推理和系统性思考。

  • 迭代:通过不断调整反应和行动,模型能够在交互中逐步改进其输出,形成一个动态学习的过程。

ReAct范式旨在提升人工智能在理解和生成自然语言方面的能力,使其在面对复杂问题时更加灵活和有效。通过这种方式,AI不仅能够提供准确的信息,还能在需要的时候进行深入分析和解释。

工具链组合思路

  • Step1, 用户提交任务描述
  • Step2, Agent分析任务,决定使用哪些工具
  • Step3, Agent通过ReAct框架调用相应工具
  • Step4, 系统整合各工具结果,生成最终回答
python from langchain.agents import Tool, AgentExecutor, create_react_agent from langchain.prompts import PromptTemplate from langchain.schema import AgentAction, AgentFinish from langchain_community.llms import Tongyi from langchain.memory import ConversationBufferMemory import re import json from typing import List, Union, Dict, Any import os import dashscope # 从环境变量获取 dashscope 的 API Key api_key = os.environ.get('DASHSCOPE_API_KEY') dashscope.api_key = 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", dashscope_api_key=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))

提示词模版使用以下格式:
问题: 你需要回答的问题
思考: 你应该始终思考要做什么
行动: 要使用的工具名称
行动输入: 工具的输入
观察: 工具的结果

在 LangChain 中,{agent_scratchpad} 是一个重要的占位符
变量,用于在智能体(Agent)运行过程中临时存储和传
递中间步骤的信息(比如思考过程、工具调用记录等)。
它的作用类似于一个“草稿本”

实现细节

ReAct框架:使用LangChain的ReAct框架,允许代理执行思考-行动-观察的循环:

  1. 思考:分析任务,确定下一步行动
  2. 行动:调用适当的工具
  3. 观察:分析工具返回的结果
  4. 重复:根据观察结果继续思考,直到任务完成

工具注册与调用:每个工具需要以特定格式注册,包括名称、描述和执行函数:

Tool(name=tool_instance.name,func=tool_instance.run,description="工具描述...")

内存与上下文:系统使用ConversationBufferMemory存储对话历史,使代理能够参考之前的交互
memory=ConversationBufferMemory(memory_key=“chat_history”)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 3:05:54

常用的电路保护元件

电子电路很容易在过压、过流、浪涌等情况发生的时候损坏&#xff0c;随着技术的发展&#xff0c;电子电路的产品日益多样化和复杂化&#xff0c;而电路保护则变得尤为重要。电路保护元件也从简单的玻璃管保险丝&#xff0c;变得种类更多&#xff0c;防护性能更优越。电路保护的…

作者头像 李华
网站建设 2026/4/15 16:31:56

mysql | limit 用法详解及注意事项

mysql 中的 limit 用来限制 select 查询返回的行数&#xff0c;程序中常被用作分页查询。一、limit 用法及示例&#xff08;一&#xff09;基础用法及示例语法&#xff1a;select * from 表名 limit [offset,] count参数说明&#xff1a;offset&#xff1a;偏移量&#xff0c;即…

作者头像 李华
网站建设 2026/4/7 18:11:37

读不懂诗歌:钟摆的胎动里倒游的鱼群正在翻译冰层

439、测不准——灵遁者电子在瓶中旋转时樵夫正举起斧头整个森林的寂静蜷缩成一道波函数被一声声鸟鸣测量440、战火沉思——灵遁者战场上&#xff0c;生命如蝼蚁般脆弱&#xff0c;瞬间消逝&#xff0c;不留一丝痕迹。灵魂在枪林弹雨中颤抖&#xff0c;寻找着救赎&#xff0c;却…

作者头像 李华
网站建设 2026/4/18 5:31:57

2个真正能用的免费降AI率的工具,知网AIGC率低于15%!

2个实测免费的降AIGC率工具&#xff0c;顺利通过ai率查重&#xff01; AI 检测本身就没有公开算法&#xff0c;降 AI 工具更像黑箱。如果降AI率连一次免费试用都不给&#xff0c;那风险太大了。万一AI率没有降下来&#xff0c;又不能退&#xff0c;少则几元多则几十。 对于学…

作者头像 李华
网站建设 2026/4/18 3:01:59

别再踩坑了!6款实测有效的降ai工具推荐,保姆级教你降低ai率!

你的论文是不是AI率超高&#xff1f;一查降ai率结果80%以上&#xff1f; 别急&#xff0c;这种情况很多人遇到过。 用AI工具写论文确实快&#xff0c;但“AI味”太浓就容易翻车。 今天我就来分享几款自己用过、真心能打的ai降ai工具&#xff0c;从免费降ai率工具到专业级都涵…

作者头像 李华
网站建设 2026/4/10 0:39:52

【Memory协议栈】AUTOSAR架构下NvM_ReadAll时间优化的实用方案

目录 前言 正文 1.常见的优化办法 2.实用的优化办法 2.1 优化原理 2.2 具体实施步骤 2.3. 验证效果 3.总结 前言 熟悉AUTOSAR架构的工程师应该都知道NvM_ReadAll一般放在ECU的上电Sequence当中,且在NvM_ReadAll之后有一个do while{}循环等到NvM Stack完成ReadAll的处理…

作者头像 李华