Langchain Chain 的常见类型以及简单实战

1. Langchain中, chain分类总结

在 Langchain 中,Chain 是构建复杂应用的核心构建块。Chain 是由一系列的组件(如 LLMs、工具和其他链)按特定顺序组合而成,通常用于将多个操作串联起来,以完成复杂的任务。

在 Langchain 中,Chain 可以分为以下几类:

1. 基础链 (Basic Chains)

基础链是最简单的链,通常由一个单一的操作组成。最常见的就是将一个语言模型(LLM)与输入数据直接连接,输出结果。

  • LLMChain:通常用于构建一个与语言模型(如 GPT-3)进行交互的链,它接收输入,生成一个输出。
  • TextPromptChain:通过组合文本提示与语言模型,来实现自然语言处理任务。

2. 组合链 (Composite Chains)

组合链将多个基础链或其他链组合成一个更复杂的链,通常用于更复杂的任务。它们通过顺序地将输入传递给多个链来处理数据。

  • SequentialChain:按顺序执行多个链,每个链的输出作为下一个链的输入。这种类型的链适用于处理需要分步骤的任务,例如文本生成、信息提取等。
  • MapReduceChain:将数据分割成小块,独立处理后再进行合并。适用于需要对大量数据进行分布式处理的场景。

3. 条件链 (Conditional Chains)

条件链根据某些条件来决定接下来使用哪个链,通常在执行时动态选择。

  • ConditionalChain:根据输入或其他外部因素,选择要执行的链。例如,给定某个输入,可以选择执行 A 链或 B 链。

4. 多步链 (Multi-Step Chains)

多步链是指执行一系列操作,其中每一步可能涉及到多个不同的处理步骤,或者在执行过程中需要与外部系统进行交互。

  • AgentChain:它能够通过多个步骤智能地选择工具并调用它们,适用于需要复杂决策逻辑的任务。例如,某些任务需要从多个外部 API 获取数据,或者根据前一步的输出执行特定操作。

5. 自定义链 (Custom Chains)

自定义链允许用户根据自己的需求定义处理逻辑。用户可以将多个操作组合在一起,灵活地处理输入和输出。

  • Custom Chain:用户可以通过自定义 Chain 来满足复杂的逻辑需求。它可以包含多个组件,如输入解析、模型调用、后处理等。

6. 工具链 (Tool-based Chains)

工具链将各种外部工具(如数据库查询、API 调用等)集成到链中,通常在智能体中使用。

  • ToolAgent:可以与各种外部工具进行交互,如执行 SQL 查询、调用 REST API、读取文件等。它们通常用于需要获取外部资源或执行复杂计算的应用。

总结:

Langchain 中的 Chain 是构建应用程序的基本组成部分。不同的链类型可以满足从简单任务到复杂流程的不同需求。通过合理地选择和组合这些链,能够构建出强大且灵活的应用程序。

2. LangChain LCEL背景下, Chain的综合实战

Langchain 中,LCEL (Language Chain Execution Logic) 是一种增强型执行逻辑,主要用于处理多步骤、

### 关于 LangChain Agent 的实际项目案例与示例 LangChain 提供了一种灵活的方式来构建和管理 Agents,使其能够通过调用外部工具完成复杂的任务。以下是几个常见实战项目案例及其代码实现。 #### 1. 使用 OpenAI 函数代理创建简单问答系统 此示例展示了如何利用预定义的提示模板快速设置一个基于函数的代理: ```python from langchain.agents import load_tools, initialize_agent from langchain.llms import OpenAI # 初始化 LLM 和 工具链 llm = OpenAI(temperature=0) tools = load_tools(["serpapi", "llm-math"], llm=llm) # 创建 agent 并指定其行为模式 agent_chain = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=True) # 测试运行 result = agent_chain.run("谁赢得了2022年世界杯?") print(result) # 输出结果并展示推理过程[^1] ``` 上述代码片段中,`initialize_agent` 方法被用来初始化一个零样本反应描述型代理 (Zero-Shot React Description),它可以根据上下文动态决定使用哪些工具来解决问题。 --- #### 2. 构建多步骤 SQL 查询解析器 如果目标是从自然语言查询转换成数据库操作,则可以考虑如下方式: ```python from langchain.agents.agent_toolkits import create_sql_agent from langchain.sql_database import SQLDatabase from langchain.llms.openai import OpenAI from langchain.agents import AgentExecutor from langchain.agents.agent_types import AgentType db_url = "sqlite:///your-database.db" database = SQLDatabase.from_uri(db_url) llm = OpenAI(temperature=0) sql_agent_executor = create_sql_agent( llm=llm, toolkit=create_sql_agent(llm=llm, db=database), agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True ) response = sql_agent_executor.run("告诉我销售额最高的产品是什么?") print(response) # 返回对应的产品名称以及销售金额[^2] ``` 这里的关键在于 `create_sql_agent` 函数的应用,它可以自动将用户的提问转化为针对特定关系型数据库的有效SQL语句执行请求。 --- #### 3. 综合多种工具解决复杂问题 对于更高级别的需求——例如需要结合搜索引擎、文档检索以及其他自定义插件共同工作时,可以通过组合不同类型的 agents 来达成目的: ```python from langchain.document_loaders import DirectoryLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.embeddings.openai import OpenAIEmbeddings from langchain.vectorstores import Chroma from langchain.chains.question_answering import load_qa_chain from langchain.prompts.prompt import PromptTemplate from langchain.chat_models import ChatOpenAI import os loader = DirectoryLoader('./data', glob='*.txt') documents = loader.load() text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=0) texts = text_splitter.split_documents(documents) embeddings = OpenAIEmbeddings() docsearch = Chroma.from_documents(texts, embeddings).as_retriever(search_kwargs={"k": 1}) template = """Use the following pieces of context to answer the question at the end. {context} Question: {question} Answer:""" QA_CHAIN_PROMPT = PromptTemplate(input_variables=["context", "question"], template=template) qa_chain = load_qa_chain(ChatOpenAI(), chain_type="stuff", prompt=QA_CHAIN_PROMPT) def complex_query(query): docs = docsearch.get_relevant_documents(query) result = qa_chain({"input_documents": docs, "question": query}, return_only_outputs=True)["output_text"] return result answer = complex_query("解释一下量子力学的基础原理.") print(answer) # 展现详细的解答内容[^3] ``` 这段脚本首先加载本地文件夹中的所有文本资料作为知识库的一部分;接着采用嵌入向量存储技术建立索引结构以便高效查找相似段落;最后再借助定制化的大规模生成模型给出精确答案。 --- #### 性能优化技巧 为了提高效率减少延迟时间,在设计阶段就应该考虑到以下几个方面: - **缓存机制**:重复计算的结果可以直接读取而无需再次求解; - **异步处理**:允许并发访问多个资源从而加快整体进度; - **简化逻辑流**:去除不必要的中间环节以降低开销成本。[^4] --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI Agent首席体验官

您的打赏是我继续创作的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值