LangChain 旨在提供一个标准接口,用于与各种大型语言模型(LLM)进行交互。这种设计很有价值,因为不同的 LLM 服务商通常有不同的 API、认证方法和配置参数。通过使用 LangChain 的模型组件,您可以编写不那么依赖于特定底层 LLM 服务的应用程序逻辑。这一点上,LangChain 的模型基类是:LLM:此类主要用于执行文本补全的模型。您提供一个文本提示,模型会返回一个补全后的文本字符串。ChatModel:此类专为优化对话交互的模型设计。与单个字符串提示不同,您通常提供一系列聊天消息(通常带有“系统”、“人类”、“AI”等角色),模型会返回一条聊天消息作为输出。尽管它们的输入/输出格式为匹配底层模型类型而略有不同,但 LangChain 仍力求在 LLM 和 ChatModel 的集成中提供一致的方法,例如 invoke、stream 和 batch。整合特定服务商LangChain 通过专门的集成包支持多种 LLM 服务商。您通常需要安装基础的 langchain 库以及您所需服务商的特定软件包(例如 langchain-openai、langchain-huggingface)。让我们看看如何为几个常见的服务商实例化模型对象。OpenAIOpenAI 模型(如 GPT-4、GPT-3.5 Turbo)得到广泛使用。LangChain 提供 OpenAI(用于较旧的补全端点)和 ChatOpenAI(用于聊天补全端点,这现在是标准方式)。要使用 ChatOpenAI,首先确保您已安装必要的软件包:pip install langchain-openai您还需要设置您的 OpenAI API 密钥。正如第 2 章中讨论的,标准且安全的操作是将其设置为名为 OPENAI_API_KEY 的环境变量。LangChain 会自动查找此变量。import os from langchain_openai import ChatOpenAI # 确保您的 OPENAI_API_KEY 已设置为环境变量 # 示例:os.environ["OPENAI_API_KEY"] = "your_api_key_here" # 不建议用于生产环境 # 初始化 ChatOpenAI 模型实例 # 默认情况下,它使用 OPENAI_API_KEY 环境变量 # 您可以指定模型名称、温度等 llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.7) # 调用示例(ChatModels 期望消息) from langchain_core.messages import HumanMessage, SystemMessage messages = [ SystemMessage(content="您是一个将英语翻译成法语的有用助手。"), HumanMessage(content="翻译这句话:'Hello, how are you?'") ] # 使用 invoke 方法进行单次调用 response = llm.invoke(messages) print(response.content) # 预期输出(可能略有不同):Bonjour, comment ça va?请注意,初始化涉及创建特定于服务商的类 (ChatOpenAI) 的实例,并传递诸如 model 和 temperature 等配置参数。实际的交互使用标准的 invoke 方法。Hugging Face HubHugging Face 托管了大量开源模型。LangChain 允许通过 HuggingFaceHub 类与 Hugging Face Hub 上托管的模型进行交互。首先,安装所需软件包:pip install langchain-huggingface huggingface_hub您需要一个 Hugging Face API 令牌。将其设置为 HUGGINGFACEHUB_API_TOKEN 环境变量。import os from langchain_huggingface import HuggingFaceHub # 确保您的 HUGGINGFACEHUB_API_TOKEN 已设置为环境变量 # 示例:os.environ["HUGGINGFACEHUB_API_TOKEN"] = "your_hf_token_here" # 初始化 HuggingFaceHub LLM 实例 # 您必须指定模型仓库 ID # 示例:使用一个较小的免费模型进行演示 hf_llm = HuggingFaceHub( repo_id="google/flan-t5-small", model_kwargs={"temperature": 0.8, "max_length": 64} ) # 调用示例(LLM 类期望一个字符串提示) prompt = "将英语翻译成法语:'Hello, how are you?'" # 使用 invoke 方法 response = hf_llm.invoke(prompt) print(response) # 预期输出(可能因模型而异):Bonjour, comment allez-vous?在这里,我们使用了 LLM 集成 (HuggingFaceHub)。我们为所需模型指定了 repo_id,并通过 model_kwargs 传递了模型特有的参数。同样,即使服务商和模型类型与 OpenAI 示例不同,交互仍使用标准的 invoke 方法。抽象的优点使用 LangChain 模型集成的主要优点是一致的接口。digraph G { rankdir=LR; node [shape=box, style=rounded, fontname="Arial", fontsize=10, margin=0.2]; edge [fontname="Arial", fontsize=9]; subgraph cluster_langchain { label = "LangChain 应用程序代码"; bgcolor="#e9ecef"; app_code [label="您的代码\n(使用 llm.invoke, .stream 等)"]; } subgraph cluster_abstraction { label = "LangChain 模型抽象层"; bgcolor="#dee2e6"; node [fillcolor="#a5d8ff"]; langchain_model [label="ChatModel / LLM 接口\n(例如, ChatOpenAI, HuggingFaceHub)"]; } subgraph cluster_providers { label = "LLM 服务商 API"; bgcolor="#ced4da"; node [shape=cylinder, fillcolor="#ffec99"]; openai_api [label="OpenAI API"]; hf_api [label="Hugging Face API"]; other_api [label="其他 API..."]; } app_code -> langchain_model [label="实例化并调用"]; langchain_model -> openai_api [label="转换为对 的调用"]; langchain_model -> hf_api [label="转换为对 的调用"]; langchain_model -> other_api [style=dashed]; }LangChain 提供封装类(如 ChatOpenAI、HuggingFaceHub),它们实现了通用接口(LLM 或 ChatModel)。您的应用程序代码与此标准接口交互,而封装类则处理与实际服务商 API 通信的具体细节。这种设计让您可以:更容易切换服务商: 如果您最初使用一个服务商(例如 OpenAI),后来决定切换到另一个(例如通过 Hugging Face 库或 Ollama 访问的自托管模型),您主要只需更改代码中模型实例化的部分。使用 invoke、stream 等的核心逻辑通常保持不变或只需少量修改。试验不同的模型: 您可以通过在初始化时简单地更改 model 参数,来测试各种模型,即使是来自同一个服务商的模型(例如,在 gpt-4 和 gpt-3.5-turbo 之间切换)。一致的配置: LangChain 尝试标准化 temperature 或 max_tokens 等常见参数,尽管特定于服务商的参数可能仍然存在(通常通过 model_kwargs 传递)。尽管由于模型能力和特定 API 功能的差异,完美的互换性并非总能实现,但 LangChain 显著减少了使用不同 LLM 后端的麻烦。在接下来的部分中,当您使用提示和输出解析器构建更复杂的工作流程时,这种一致的模型接口会变得越来越有用。