掘金 人工智能 前天 10:58
05 一分钟搞懂langchain的链是如何工作的
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入探讨了Langchain中LLMChain的工作流程,从初始化到运行的每个环节。文章首先展示了一个典型的Langchain使用示例,然后详细分析了Chain的初始化、运行流程,包括提示模板的创建、LLM的调用和输出的处理。通过对源码的解读,揭示了Langchain如何灵活控制LLM输出的呈现形式,帮助读者理解Langchain链的工作机制。

🔨 **初始化阶段**:创建LLMChain时,会存储LLM实例和提示模板实例。LLMChain继承自Chain基类,为后续运行做好准备。

⚙️ **运行流程**:当调用chain.run()时,实际调用_call方法。_call方法首先使用提示模板格式化输入,然后将格式化后的提示传递给LLM,最后处理LLM的输出并返回。

📝 **提示词整理**:在generate方法中,通过遍历输入字典,将所需信息填充到提示模板中,生成最终的提示词列表。

💡 **结果生成与处理**:整理好的提示词列表被传递给LLM处理后返回结果。create_outputs函数负责从LLM的输出中提取文本结果,并根据配置决定是否保留原始生成信息。

✅ **输出形式控制**:Langchain提供灵活机制,控制LLM输出的呈现形式,可以选择只输出最终文本结果或包含更多原始生成信息。

一个典型langchain的使用流程:

from langchain.llms import OpenAIfrom langchain.prompts import PromptTemplatefrom langchain.chains import LLMChain  # 初始化语言模型llm = OpenAI(temperature=0.9)# 创建提示模板prompt = PromptTemplate(    input_variables=["product"],    template="What is a good name for a company that makes {product}?",)# 此处创建链chain = LLMChain(llm=llm, prompt=prompt)# 运行链result = chain.run(product="colorful socks")

我们来看下Chain是怎么工作的

⛓️ 链 (Chain) 初始化与调用

一、初始化

当创建一个链时(如 LLMChain(llm=llm, prompt=prompt)):

    首先调用 LLMChain 类的构造函数该构造函数继承自 Chain 基类存储 LLM 和提示模板实例代码路径:libs/langchain/langchain/chains/llm.py
class LLMChain(Chain):    """使用语言模型的链"""    prompt: BasePromptTemplate    llm: BaseLanguageModel    output_key: str = "text"    output_parser: Optional[BaseOutputParser] = None    return_final_only: bool = True

二、调用chain的流程

当运行一个链时(如 chain.run(product="colorful socks")):

    run 方法是 __call__ 方法的便捷包装,实际上会调用 _call 方法核心为generate()生成llm对应的prompt与self.create_outputs(response)生成llm的输出结果代码路径:libs/langchain/langchain/chains/base.py
def _call(        self,        inputs: dict[str, Any],        run_manager: Optional[CallbackManagerForChainRun] = None,    ) -> dict[str, str]:        response = self.generate([inputs], run_manager=run_manager)        return self.create_outputs(response)[0]
    LLMChain 中,_call 方法会:   a. 使用提示模板格式化输入   b. 将格式化后的提示传递给 LLM   c. 处理 LLM 的输出并返回
def generate(        self,        input_list: list[dict[str, Any]],        run_manager: Optional[CallbackManagerForChainRun] = None,    ) -> LLMResult:        """Generate LLM result from inputs."""        prompts, stop = self.prep_prompts(input_list, run_manager=run_manager)        callbacks = run_manager.get_child() if run_manager else None        if isinstance(self.llm, BaseLanguageModel):            return self.llm.generate_prompt(                prompts,                stop,                callbacks=callbacks,                **self.llm_kwargs,            )        else:            results = self.llm.bind(stop=stop, **self.llm_kwargs).batch(                cast(list, prompts), {"callbacks": callbacks}            )            generations: list[list[Generation]] = []            for res in results:                if isinstance(res, BaseMessage):                    generations.append([ChatGeneration(message=res)])                else:                    generations.append([Generation(text=res)])            return LLMResult(generations=generations)
def create_outputs(self, llm_result: LLMResult) -> list[dict[str, Any]]:        """Create outputs from response."""        result = [            # Get the text of the top generated string.            {                self.output_key: self.output_parser.parse_result(generation),                "full_generation": generation,            }            for generation in llm_result.generations        ]        if self.return_final_only:            result = [{self.output_key: r[self.output_key]} for r in result]        return result
简单理解

create_outputs函数就是流水线末端的包装工

    它拿到LLM吐出来的“半成品”答案(llm_result.generations)。通过“加工工具”(output_parser)将每个“半成品”加工成我们需要的“成品”文本,并把原始的“半成品”也进行备份。接下来,它看一眼“订单要求”(self.return_final_only):
      若订单要求“只出成品”,它就丢掉保留的“半成品”,把“成品”装箱。若订单要求“成品和半成品都要”,则把所有东西都装箱。
    最后,把装箱的“产品”(整理后的字典列表)交出去。

三、总结:

langchain为我们提供了一个灵活的机制,能够控制从LLM 获取到的原始数据最终以什么形式呈现给出来,是只输出最终的文本结果,还是也需要更多的原始生成信息。

github有帮助可以金手指点击start支持下作者

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Langchain LLMChain 工作原理 源码分析
相关文章