掘金 人工智能 5小时前
03 一分钟搞明白langchain如何运行LLM
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入解析了LangChain框架中语言模型(LLM)的初始化和调用流程。文章从一个典型LangChain使用流程的例子入手,详细拆解了LLM、PromptTemplate和LLMChain等核心组件。重点分析了LLM的初始化过程,包括如何通过继承关系设置基础属性。同时,详细阐述了LLM生成文本时的调用流程,例如invoke方法如何将输入转换为PromptValue,以及generate_prompt方法如何调用特定LLM实现的API接口。最后,总结了模型初始化的关键在于根据不同的大模型属性完成初始化,模型调用的关键在于将提示词等数据转化为LLM可理解的格式并处理返回数据。

📥 LangChain通过导入模块运行,没有单一入口。一个典型流程包括初始化语言模型、创建提示模板和创建链,最后运行链。

🔍 LLM初始化涉及调用OpenAI类的构造函数,该函数继承自BaseLLM,BaseLLM又继承自BaseLanguageModel,并在BaseLanguageModel中设置基础属性,如cache、callbacks等。

⚙️ LLM生成文本时,首先调用BaseLanguageModel.invoke方法,将输入转换为PromptValue,然后调用generate_prompt方法,该方法会调用特定LLM实现的API接口,最后处理返回结果。

📝 generate_prompt方法是调用模型生成文本的关键,它将传入的提示词转换为模型能理解的格式,并传入停止词、回调、标签等参数。

📥 运行入口与初始化

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")

来逐步解析各个核心组件的初始化和调用逻辑。

🔍 语言模型 (LLM) 初始化与调用

一、初始化流程

创建一个 LLM 实例时,实际发生了以下调用:

    调用 OpenAI 类的构造函数该函数继承自 BaseLLMBaseLLM又继承自 BaseLanguageModelBaseLanguageModel 中设置基础属性(如 cache、callbacks 等)代码路径:libs/core/langchain_core/language_models/base.py
class BaseLanguageModel(RunnableSerializable[LanguageModelInput, LanguageModelOutputVar], ABC):    """所有语言模型的抽象基类"""    cache: Union[BaseCache, bool, None] = Field(default=None, exclude=True)    verbose: bool = Field(default_factory=_get_verbosity, exclude=True, repr=False)    callbacks: Callbacks = Field(default=None, exclude=True)    tags: Optional[list[str]] = Field(default=None, exclude=True)    metadata: Optional[dict[str, Any]] = Field(default=None, exclude=True)    custom_get_token_ids: Optional[Callable[[str], list[int]]] = Field(default=None, exclude=True)

二、调用流程

当使用 LLM 生成文本时(如 llm("What is the capital of France?")):

    首先会调用 BaseLanguageModel.invoke 方法该方法会将输入转换为 PromptValue然后调用 generate_prompt 方法generate_prompt 方法会调用特定 LLM 实现的 API 接口(如 OpenAI API)返回的结果会被处理并返回给用户

invoke方法核心逻辑如下

return (    self.generate_prompt(        [self._convert_input(input)],        stop=stop,        callbacks=config.get("callbacks"),        tags=config.get("tags"),        metadata=config.get("metadata"),        run_name=config.get("run_name"),        run_id=config.pop("run_id", None),        **kwargs,    )    .generations[0][0]    .text)
    调用 self.generate_prompt(...)
      这是调用模型生成文本的关键方法。先把传入的提示词 inputgenerate_prompt 方法支持批量输入) 转换成模型能理解的格式;这一步很重要,不同模型或链条,输入格式可能不同,所以要统一处理。传入了转换好的输入、停止词、回调、标签、元数据、运行名称和 ID,以及额外参数。
    调用.generations.text
      generate_prompt 返回的结果是一个复杂对象,因此通过.generations[0][0] 取第一个输入的第一个生成结果。.text 则是最终的纯文本内容。

模型是根据不同的大模型属性(如openai)来完成初始化。模型的调用关键是将提示词、数据等等数据转化成LLM能够理解的格式再发送,并将返回的复杂数据处理成我们要的预期数据再返回。

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

Fish AI Reader

Fish AI Reader

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

FishAI

FishAI

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

联系邮箱 441953276@qq.com

相关标签

LangChain LLM 初始化 调用流程
相关文章