浪链部分构建强大的链和代理

浪链部分构建强大的链和代理

在langchain中构建强大的链和代理

在这篇综合指南中,我们将深入探讨langchain的世界,重点关注构建强大的链和代理。我们将涵盖从理解链的基础知识到将其与大型语言模型(llm)相结合以及引入用于自主决策的复杂代理的所有内容。

1. 理解链

1.1 浪链中什么是链?

langchain 中的链是按特定顺序处理数据的操作或任务序列。它们允许模块化和可重用的工作流程,从而更轻松地处理复杂的数据处理和语言任务。链是创建复杂的人工智能驱动系统的构建块。

1.2 链条的类型

langchain 提供多种类型的链,每种类型适合不同的场景:

顺序链:这些链以线性顺序处理数据,其中一个步骤的输出作为下一步的输入。它们非常适合简单、分步的流程。

映射/归约链:这些链涉及将函数映射到一组数据,然后将结果归约为单个输出。它们非常适合并行处理大型数据集。

路由器链:这些链根据特定条件将输入直接输入到不同的子链,从而允许更复杂的分支工作流程。

1.3 创建自定义链

创建自定义链涉及定义将成为链一部分的特定操作或功能。这是自定义顺序链的示例:

from langchain.chains import llmchainfrom langchain.llms import openaifrom langchain.prompts import prompttemplateclass customchain:    def __init__(self, llm):        self.llm = llm        self.steps = []    def add_step(self, prompt_template):        prompt = prompttemplate(template=prompt_template, input_variables=["input"])        chain = llmchain(llm=self.llm, prompt=prompt)        self.steps.append(chain)    def execute(self, input_text):        for step in self.steps:            input_text = step.run(input_text)        return input_text# initialize the chainllm = openai(temperature=0.7)chain = customchain(llm)# add steps to the chainchain.add_step("summarize the following text in one sentence: {input}")chain.add_step("translate the following english text to french: {input}")# execute the chainresult = chain.execute("langchain is a powerful framework for building ai applications.")print(result)

此示例创建一个自定义链,首先汇总输入文本,然后将其翻译为法语。

2. 连锁学与法学硕士的结合

2.1 将链与提示和 llm 集成

chains 可以与提示和 llm 无缝集成,以创建更强大、更灵活的系统。这是一个例子:

from langchain import prompttemplate, llmchainfrom langchain.llms import openaifrom langchain.chains import simplesequentialchainllm = openai(temperature=0.7)# first chain: generate a topicfirst_prompt = prompttemplate(    input_variables=["subject"],    template="generate a random {subject} topic:")first_chain = llmchain(llm=llm, prompt=first_prompt)# second chain: write a paragraph about the topicsecond_prompt = prompttemplate(    input_variables=["topic"],    template="write a short paragraph about {topic}:")second_chain = llmchain(llm=llm, prompt=second_prompt)# combine the chainsoverall_chain = simplesequentialchain(chains=[first_chain, second_chain], verbose=true)# run the chainresult = overall_chain.run("science")print(result)

这个示例创建了一个链,该链生成一个随机科学主题,然后写一个关于它的段落。

2.2 调试和优化链-llm 交互

要调试和优化链-llm 交互,您可以使用详细参数和自定义回调:

from langchain.callbacks import stdoutcallbackhandlerfrom langchain.chains import llmchainfrom langchain.llms import openaifrom langchain.prompts import prompttemplateclass customhandler(stdoutcallbackhandler):    def on_llm_start(self, serialized, prompts, **kwargs):        print(f"llm started with prompt: {prompts[0]}")    def on_llm_end(self, response, **kwargs):        print(f"llm finished with response: {response.generations[0][0].text}")llm = openai(temperature=0.7, callbacks=[customhandler()])template = "tell me a {adjective} joke about {subject}."prompt = prompttemplate(input_variables=["adjective", "subject"], template=template)chain = llmchain(llm=llm, prompt=prompt, verbose=true)result = chain.run(adjective="funny", subject="programming")print(result)

此示例使用自定义回调处理程序来提供有关 llm 输入和输出的详细信息。

3. 代理介绍

3.1 浪链中的代理是什么?

浪链中的代理是自治实体,可以使用工具并做出决策来完成任务。他们将法学硕士与外部工具相结合来解决复杂的问题,从而实现更具动态性和适应性的人工智能系统。

3.2 内置代理及其功能

langchain 提供了多种内置代理,例如 zero-shot-react-description 代理:

from langchain.agents import load_tools, initialize_agent, agenttypefrom langchain.llms import openaillm = openai(temperature=0)tools = load_tools(["wikipedia", "llm-math"], llm=llm)agent = initialize_agent(    tools,     llm,     agent=agenttype.zero_shot_react_description,    verbose=true)result = agent.run("what is the square root of the year plato was born?")print(result)

此示例创建一个可以使用维基百科并执行数学计算来回答复杂问题的代理。

3.3 创建自定义代理

您可以通过定义自己的工具和代理类来创建自定义代理。这允许针对特定任务或领域定制高度专业化的代理。

这是自定义代理的示例:

from langchain.agents import Tool, AgentExecutor, LLMSingleActionAgentfrom langchain.prompts import StringPromptTemplatefrom langchain import OpenAI, SerpAPIWrapper, LLMChainfrom typing import List, Unionfrom langchain.schema import AgentAction, AgentFinishimport re# Define custom toolssearch = SerpAPIWrapper()tools = [    Tool(        name="Search",        func=search.run,        description="Useful for answering questions about current events"    )]# Define a custom prompt templatetemplate = """Answer the following questions as best you can:{input}Use the following format:Question: the input question you must answerThought: you should always think about what to doAction: the action to take, should be one of [{tool_names}]Action Input: the input to the actionObservation: the result of the action... (this Thought/Action/Action Input/Observation can repeat N times)Thought: I now know the final answerFinal Answer: the final answer to the original input questionBegin!Question: {input}Thought: To answer this question, I need to search for current information.{agent_scratchpad}"""class CustomPromptTemplate(StringPromptTemplate):    template: str    tools: List[Tool]    def format(self, **kwargs) -> str:        intermediate_steps = kwargs.pop("intermediate_steps")        thoughts = ""        for action, observation in intermediate_steps:            thoughts += action.log            thoughts += f"nObservation: {observation}nThought: "        kwargs["agent_scratchpad"] = thoughts        kwargs["tool_names"] = ", ".join([tool.name for tool in self.tools])        return self.template.format(**kwargs)prompt = CustomPromptTemplate(    template=template,    tools=tools,    input_variables=["input", "intermediate_steps"])# Define a custom output parserclass CustomOutputParser:    def parse(self, llm_output: str) -> Union[AgentAction, AgentFinish]:        if "Final Answer:" in llm_output:            return AgentFinish(                return_values={"output": llm_output.split("Final Answer:")[-1].strip()},                log=llm_output,            )        action_match = re.search(r"Action: (w+)", llm_output, re.DOTALL)        action_input_match = re.search(r"Action Input: (.*)", llm_output, re.DOTALL)        if not action_match or not action_input_match:            raise ValueError(f"Could not parse LLM output: `{llm_output}`")        action = action_match.group(1).strip()        action_input = action_input_match.group(1).strip(" ").strip('"')        return AgentAction(tool=action, tool_input=action_input, log=llm_output)# Create the custom output parseroutput_parser = CustomOutputParser()# Define the LLM chainllm = OpenAI(temperature=0)llm_chain = LLMChain(llm=llm, prompt=prompt)# Define the custom agentagent = LLMSingleActionAgent(    llm_chain=llm_chain,    output_parser=output_parser,    stop=["nObservation:"],    allowed_tools=[tool.name for tool in tools])# Create an agent executoragent_executor = AgentExecutor.from_agent_and_tools(agent=agent, tools=tools, , verbose=True)# Run the agentresult = agent_executor.run(“What’s the latest news about AI?”)print(result)

结论

langchain 的链和代理为构建复杂的人工智能驱动系统提供了强大的功能。当与大型语言模型 (llm) 集成时,它们可以创建适应性强的智能应用程序,旨在解决各种任务。当您在 langchain 之旅中不断进步时,请随意尝试不同的链类型、代理设置和自定义模块,以充分利用该框架的潜力。

以上就是浪链部分构建强大的链和代理的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1348446.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
python如何计算销售额
上一篇 2025年12月13日 12:02:54
性能追求第二部分:Perl 与 Python
下一篇 2025年12月13日 12:02:59

相关推荐

  • C++跨平台开发需要哪些工具 CMake跨平台构建指南

    C++跨平台开发需依赖CMake等%ignore_a_1%链,核心在于抽象平台差异。CMake作为元构建系统,通过CMakeLists.txt生成各平台原生构建文件,协调编译器、IDE、调试器及包管理器(如vcpkg、Conan),实现跨平台编译。选择工具时需权衡项目规模、团队熟悉度、目标平台和依赖…

    2026年5月10日
    000
  • 新手入门隐私币交易|交易所选择与安全转账教学

    Binance币安 欧易OKX ️ Huobi火币️ 刚接触隐私币,最关心的无非两件事:钱放哪儿安全?怎么交易不被盯上?门罗币(XMR)这类主打匿名的加密货币,玩法和比特币不太一样。核心思路是“选对地方买,提出来存好”。别急着搞复杂操作,先把交易所选择和钱 包转账这两步走稳,后面再研究混币、环签名那…

    2026年5月10日
    000
  • PHP内部函数是什么

    PHP内部函数是PHP语言内置的、由C语言编写的核心函数,无需引入即可直接使用,具有高效性、跨平台性和易用性。它们在PHP启动时自动加载,涵盖字符串处理(如strlen)、数组操作(如array_push)、文件读写(如file_get_contents)、时间管理(如time)和数据编码(如jso…

    2026年5月10日
    000
  • javascript闭包怎么实现单例模式

    javascript闭包怎么实现单例模式javascript闭包怎么实现单例模式javascript闭包怎么实现单例模式javascript闭包怎么实现单例模式

    闭包实现单例的核心是利用iife创建私有变量instance,通过闭包保持其状态,确保只在首次调用getinstance时初始化,后续调用均返回同一实例;2. 该方式优势在于提供私有性、状态持久化、支持延迟加载且不污染全局命名空间;3. 需注意测试困难、过度使用导致耦合、内存泄漏风险及在微前端等多实…

    2026年5月10日 用户投稿
    000
  • 高性能C++框架对比

    在众多高性能 c++++ 框架中,最受欢迎的选择包括 folly、boost.asio 和 qt concurrent。每个框架都有其独特的特性:folly:轻量级、高效,适用于优化异常处理、内存管理和并行处理。boost.asio:跨平台 i/o 库,提供广泛的网络和并行编程功能。qt concu…

    2026年5月10日
    000
  • 如何在多个文件输入框中实现独立图片预览功能

    本教程详细阐述了如何在网页中实现多个文件输入框(`input type=”file”`)的独立图片预览功能。通过识别并解决常见错误,如重复id导致的元素选择不当,我们将演示如何利用dom遍历和事件委托,为每个上传区域动态绑定预览逻辑,确保用户上传的每张图片都能在其对应的位置正…

    2026年5月10日
    000
  • C++ 函数调用约定在多线程编程中的作用

    多线程编程中函数调用约定的作用是决定函数参数和返回值在不同线程之间的传递方式。c++++ 提供两种调用约定:传值传递:传递参数和返回值的副本,线程间无共享内存。传地址传递:传递参数和返回值的地址,线程间共享内存。默认情况下,c++ 使用传值传递。对于共享数据(如示例中的计数器),可以通过在参数前加 …

    2026年5月10日
    000
  • 深入探讨Canvas的API功能:发掘其强大之处

    深入了解Canvas:探索其强大的API功能,需要具体代码示例 引言:Canvas是HTML5标准中的一个重要元素,它为开发者提供了一个可以使用JavaScript来绘制图形的区域。通过简单的HTML代码和JavaScript代码,开发者可以实现各种炫丽的图形、动画和交互效果。本文将深入探索Canv…

    2026年5月10日
    000
  • PHP异常怎么记录_PHP异常记录方法及错误日志管理。

    答案:通过try-catch捕获异常并写入日志文件,设置全局异常处理器防止崩溃,配置php.ini启用内置错误日志功能,以及结合Monolog等第三方库实现多渠道结构化日志管理,可有效提升PHP应用的异常记录与错误排查能力。 如果您的PHP应用程序在运行过程中出现异常,但没有明确的错误提示,可能是由…

    2026年5月10日
    000
  • .NET中接口(Interface)和抽象类(Abstract Class)的区别

    接口支持多实现,抽象类仅单继承;抽象类可包含字段和实现,接口主要用于定义行为规范;接口强调“能做什么”,抽象类表达“是什么”;修改接口影响所有实现,抽象类更易扩展。 接口(Interface)和抽象类(Abstract Class)在 .NET 中都用于实现多态和定义契约,但它们的设计目的和使用场景…

    2026年5月10日
    000
  • 自建服务器域名解析与配置详解:告别传统托管服务

    本文将详细阐述如何为自建网站(如基于Raspberry Pi)配置域名,解释域名系统(DNS)的工作原理,并指导读者通过域名注册商将域名与服务器IP地址关联。文章将区分域名注册与网站托管服务的概念,帮助读者理解自建域名所需的关键步骤,避免常见误区。 理解域名与DNS工作原理 在互联网世界中,域名是网…

    2026年5月10日
    000
  • 怎样用C++读取文件全部内容?多种文件读取方案对比

    怎样用C++读取文件全部内容?多种文件读取方案对比怎样用C++读取文件全部内容?多种文件读取方案对比怎样用C++读取文件全部内容?多种文件读取方案对比怎样用C++读取文件全部内容?多种文件读取方案对比

    在c++++中读取文件全部内容有多种方法,需根据场景选择。一、使用 ifstream + stringstream:适合小文件或无需高性能的场景,代码简洁但效率不高,注意检查文件是否打开成功;二、逐行读取:适合文本文件和内存敏感场景,节省内存便于逐行处理,但拼接全文需额外操作,注意换行符差异;三、一…

    2026年5月10日 用户投稿
    000
  • html5用什么软件

    HTML5 使用以下软件:文本编辑器(例如 Sublime Text)网页浏览器(例如 Chrome)代码验证器(例如 W3C 标记验证器)浏览器开发者工具(例如 Chrome DevTools) HTML5使用哪些软件? HTML5 是一门标记语言,用于创建和结构化 web 网页和应用程序。要使用…

    2026年5月10日
    100
  • Go语言中如何高效查找字符串中多个字符的第一次出现?

    Go语言高效查找字符串中多个字符首次出现位置 Go语言的strings.Index函数可以查找单个字符在字符串中的首次出现位置。但如果需要查找多个字符中的任意一个的首次出现位置,则需要更有效的方法。 简单的循环和if语句虽然可行,但效率不高,尤其当需要查找的字符数量较多时。 高效方法 一种更高效的方…

    2026年5月10日
    000
  • 如何理解Event Loop机制并对代码执行顺序进行精准控制?

    Event Loop通过宏任务与微任务协调异步执行,同步代码先运行,随后清空微任务队列再执行宏任务,如:console.log(‘1’)、’4’同步输出,Promise.then入微任务队列输出’3’,setTimeout入宏任…

    2026年5月10日
    000
  • Python 中何时应该使用非静态方法?

    本文旨在阐明 Python 中非静态方法的使用场景,并解释为何在某些情况下它们仍然是必要的。文章将从面向对象编程的角度出发,探讨非静态方法在代码组织、设计模式以及特殊方法中的作用,帮助开发者更好地理解和运用 Python 的方法。 在 Python 中,将方法定义为静态方法或非静态方法,取决于方法与…

    2026年5月10日
    000
  • 掌握 JavaScript 中的数组函数:slice、splice 和 forEach

    JavaScript 数组函数详解:slice、splice 和 forEach JavaScript 提供丰富的内置数组方法,方便开发者操作和处理数组元素。本文重点介绍三种常用的数组方法:slice、splice 和 forEach,它们能显著提升数组操作的效率和代码简洁性。 1. slice()…

    2026年5月10日
    000
  • C++对象生命周期管理与RAII模式结合

    RAII通过将资源管理绑定到对象生命周期,确保构造函数获取资源、析构函数释放资源,实现自动内存和资源管理。结合智能指针(如std::unique_ptr)、文件类、std::lock_guard等机制,RAII可有效避免内存泄漏、文件句柄未关闭、死锁等问题,尤其在异常发生时,C++栈展开保证已构造对…

    2026年5月10日
    000
  • python怎么取字段里的某些字

    在 Python 中提取字符串特定字符的方法有:使用切片:string[start:end:step] 返回从 start 到 end-1 的字符串子序列,步长为 step。使用索引:string[index] 直接访问字符串中特定字符,index 为字符索引。 如何使用 Python 提取字符串中…

    2026年5月10日
    100
  • C++ 框架在不同行业中的适用范围:评估优缺点

    c++++ 框架可通过提供高性能、低层访问和可移植性来简化开发。评估优缺点可以帮助确定适用行业:游戏开发:高性能图形和物理(ue4、unity)金融:专用金融建模库(quantlib、bloomberg bquant)医疗保健:医疗图像处理和可视化(dicomtoolkit、vtk)网络安全:高级加…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信