AI Agent开发学习系列 - langchain之Chains的使用(6):自行构建自定义链来实现特定目的

自定义链(Custom Chain)是指你可以根据自己的业务需求,继承 LangChain 的 Chain 基类,编写任意输入输出逻辑,实现完全自定义的推理流程。适用于标准链(如 LLMChain、SequentialChain 等)无法满足的复杂场景。

典型用法举例

假设你要实现一个"百度百科文章生成器",输入主题,输出百科风格的长文:

python 复制代码
from typing import List, Dict, Any, Optional
from langchain.callbacks.manager import CallbackManagerForChainRun
from langchain.chains.base import Chain
from langchain.prompts.base import BasePromptTemplate
from langchain.base_language import BaseLanguageModel
from langchain_openai import ChatOpenAI
from langchain.prompts import PromptTemplate
from pydantic import SecretStr
import os
from dotenv import load_dotenv

# 加载环境变量
load_dotenv()

class baidu_article_chain(Chain):
    """开发一个百度文章生成器"""
    prompt: BasePromptTemplate  # Prompt模板
    llm: BaseLanguageModel      # LLM模型
    out_key: str = "text"       # 输出的key

    @property
    def input_keys(self) -> List[str]:
        """返回Prompt所需的所有输入变量名"""
        return self.prompt.input_variables

    @property
    def output_keys(self) -> List[str]:
        """始终返回text键作为输出"""
        return [self.out_key]

    def _call(
        self,
        inputs: Dict[str, Any],
        run_manager: Optional[CallbackManagerForChainRun] = None,
    ) -> Dict[str, Any]:
        """运行链,生成百度百科文章"""
        # 格式化prompt
        prompt_value = self.prompt.format_prompt(**inputs)
        # 调用LLM生成内容
        response = self.llm.generate_prompt(
            [prompt_value],
            callbacks=run_manager.get_child() if run_manager else None
        )
        # 如果有回调,记录文本
        if run_manager:
            run_manager.on_text("baidu article is written")
        # 返回生成的文本
        return {self.out_key: response.generations[0][0].text}

    @property
    def _chain_type(self) -> str:
        """返回链的类型标识"""
        return "baidu_article_chain"

# 实例化自定义链,使用PromptTemplate和腾讯混元模型
chain = baidu_article_chain(
    prompt=PromptTemplate(
        template="在百度百科上写一篇关于{topic}的文章",
        input_variables=["topic"]
    ),
    llm=ChatOpenAI(
        api_key=SecretStr(os.environ.get("HUNYUAN_API_KEY", "")),  # 腾讯混元API KEY
        base_url="https://api.hunyuan.cloud.tencent.com/v1",        # 腾讯混元API地址
        model="hunyuan-lite",                                       # 模型名称
        temperature=0,                                              # 采样温度
    )
)

# 运行链,生成关于"人工智能"的百度百科文章
result = chain.run({"topic": "人工智能"})
print(result)

结果:

bash 复制代码
标题:人工智能:探索未来科技的新篇章

摘要:
人工智能(AI)是计算机科学的一个分支,旨在让机器模拟人类智能。本文将介绍人工智能的定义、历史、应用领域以及未来的发展趋势。

一、人工智能的定义
人工智能是指由计算机系统实现的具有类人智能的技术,包括学习、推理、感知、理解自然语言、识别图像、语音和模式等功能。

二、人工智能的历史
人工智能的概念最早可以追溯到20世纪50年代,当时的研究主要集中在通过规则和逻辑推理来实现人工智能。随着计算机技术的发展,尤其是深度学习和大数据的出现,人工智能已经取得了显著的进步。

三、人工智能的应用领域
人工智能已经广泛应用于各个领域,如自动驾驶汽车、智能家居、医疗诊断、金融分析、教育等。

四、人工智能的未来发展趋势
随着技术的不断进步,人工智能将在更多领域发挥重要作用,同时也会面临一些挑战,如数据隐私、伦理道德等问题。

总结:
人工智能是21世纪最具潜力的技术之一,它正在改变我们的生活和工作方式。尽管面临一些挑战,但人工智能的未来发展前景仍然充满希望。

关键点说明

  • 继承 Chain,实现 _call 方法,定义输入输出逻辑。
  • input_keys 和 output_keys 决定链的输入输出变量名。
  • 可以组合 LLM、检索、API 调用、任意 Python 逻辑,极其灵活。
  • 适合复杂业务流程、特殊格式输出、多步推理等高级场景。

自定义链让你可以完全掌控推理流程,实现任何标准链无法覆盖的复杂业务逻辑,是 LangChain 高级开发的核心能力。