langchain源码阅读系列(三)之Chain模块

本文是LangChain源码阅读系列的第三部分,重点介绍Chain模块。Chain定义了一组组件调用顺序,简化了复杂AI应用的实现。文中详细讲解了如何从LangChainHub加载链,运行LLM链的多种方式,以及通用工具链和专门用途链的实现。此外,还阐述了合并文档的链在对话场景、数据库问答场景和总结场景的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文首发于博客文章langchain源码阅读

本节是langchian源码阅读系列第三篇,下面进入Chain模块👇:

LLM 应用构建实践笔记

我的新书《LangChain编程从入门到实践》 已经开售!推荐正在学习AI应用开发的朋友购买阅读!
LangChain编程从入门到实践

Chain链定义

链定义为对组件的一系列调用,也可以包括其他链,这种在链中将组件组合在一起的想法很简单但功能强大,极大地简化了复杂应用程序的实现并使其更加模块化,这反过来又使调试、维护和改进应用程序变得更加容易。
Chain基类是所有chain对象的基本入口,与用户程序交互,处理用户的输入,准备其他模块的输入,提供内存能力,chain的回调能力,其他所有的 Chain 类都继承自这个基类,并根据需要实现特定的功能。

class Chain(BaseModel, ABC):
    memory: BaseMemory
    callbacks: Callbacks

    def __call__(
        self,
        inputs: Any,
        return_only_outputs: bool = False,
        callbacks: Callbacks = None,
    ) -> Dict[str, Any]:
        ...

实现自定义链

from __future__ import annotations

from typing import Any, Dict, List, Optional

from pydantic import Extra

from langchain.base_language import BaseLanguageModel
from langchain.callbacks.manager import (
    AsyncCallbackManagerForChainRun,
    CallbackManagerForChainRun,
)
from langchain.chains.base import Chain
from langchain.prompts.base import BasePromptTemplate


class MyCustomChain(Chain):
    prompt: BasePromptTemplate
    llm: BaseLanguageModel
    output_key: str = "text"

    class Config:
        extra = Extra.forbid
        arbitrary_types_allowed = True

    @property
    def input_keys(self) -> List[str]:
        """pompt中的动态变量
        """
        return self.prompt.input_variables

    @property
    def output_keys(self) -> List[str]:
        """允许直接输出的动态变量.
        """
        return [self.output_key]
    # 同步调用
    def _call(
        self,
        inputs: Dict[str, Any],
        run_manager: Optional[CallbackManagerForChainRun] = None,
    ) -> Dict[str, str]:
        # 下面是一个自定义逻辑实现
        prompt_value = self.prompt.format_prompt(**inputs)
        # 调用一个语言模型或另一个链时,传递一个回调处理。这样内部运行可以通过这个回调(进行逻辑处理)。
        response = self.llm.generate_prompt(
            [prompt_value], callbacks=run_manager.get_child() if run_manager else None
        )
        # 回调出发时的日志输出
        if run_manager:
            run_manager.on_text("Log something about this run")

        return {
   
   self.output_key: response.generations[0][0].text}
    # 异步调用
    async def _acall(
        self,
        inputs: Dict
### 关于 LangChain 的使用教程和技术文档 #### 什么是 LangChainLangChain 是一种用于构建大型语言模型 (LLM) 应用程序的开源框架,最初于2022年10月作为开源项目发布,并迅速成为开发者社区中的热门工具之一[^2]。 #### 官方技术文档和资源 以下是关于 LangChain 的一些主要学习资料和技术文档链接: 1. **官方 GitHub 存储库**: 用户可以访问 LangChain 的官方存储库来获取最新的源码更新、示例代码以及详细的 README 文件。这是了解 LangChain 功能的最佳起点。 链接: https://github.com/hwchase17/langchain 2. **官方文档网站**: LangChain 提供了一个全面的技术文档站点,涵盖了安装指南、核心概念解释(如 Chains 和 Agents)、API 参考等内容。该文档还提供了丰富的案例研究和最佳实践建议。 链接: https://langchain.readthedocs.io/en/latest/ 3. **快速入门指南**: 对于初学者来说,可以从官方提供的 Quickstart 页面入手,它会引导用户完成环境配置到第一个 LLM 应用程序创建的过程。例如,在 Python 中初始化一个简单的 Chain 如下所示: ```python from langchain.llms import OpenAI llm = OpenAI(temperature=0.9) text = "What would be a good company name for a company that makes colorful socks?" print(llm(text)) ``` 4. **Chains 的定义与实现**: 在 LangChain 架构中,“Chain”被用来描述一系列操作流程,比如 Prompt 设计、LLM 调用和工具集成等。这些链条通过模块化的方式连接在一起形成完整的应用程序逻辑[^3]。因此理解如何自定义 Chain 成为了掌握此框架的关键技能之一。 5. **社区支持与讨论区**: 如果遇到特定问题无法解决,则可以通过加入 LangChain 社区寻求帮助。这里不仅有活跃的贡献者解答疑问,还有许多实际项目的分享可供参考。 #### 示例代码片段展示 下面给出一段利用 LangChain 实现问答系统的简单例子: ```python from langchain.chains import RetrievalQA from langchain.document_loaders import TextLoader from langchain.embeddings.openai import OpenAIEmbeddings from langchain.vectorstores import Chroma from langchain.text_splitter import CharacterTextSplitter loader = TextLoader('./data/myfile.txt') documents = loader.load() text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0) texts = text_splitter.split_documents(documents) embeddings = OpenAIEmbeddings() docsearch = Chroma.from_texts([t.page_content for t in texts], embeddings).as_retriever() qa_chain = RetrievalQA.from_chain_type( llm=OpenAI(), chain_type="stuff", retriever=docsearch, input_key="question" ) query = "Who is the main character of this story?" result = qa_chain({"question": query}) print(result['answer']) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值