LangChain大模型框架& Dify低代码 AI 开发平台
目录
1. LangChain介绍
1.1 架构
1.2 概念
1.3 术语
1.4 LangChain实战
2. LLM 应用开发平台dify
2.1 dify安装
2.2 设置知识库
2.3 搭建dify工作流
3. dify 跟LangChain的区别
3.1 设计理念与目标用户
3.2 功能特点
3.3 开发过程
3.4 可靠性与支持
4. Reference
1. LangChain介绍
LangChain 是一个用于开发由大型语言模型(LLMs)驱动的应用程序的框架。
LangChain 简化了 LLM 应用程序生命周期的每个阶段:
开发:使用LangChain的开源组件和第三方集成来构建您的应用程序。 使用LangGraph来构建具有一流流处理和human-in-the-loop的状态化代理
生产化:使用LangSmith来检查、监控和评估您的应用程序,以便您可以持续优化并自信地部署
部署:使用LangGraph平台将您的LangGraph应用程序转化为生产就绪的API和助手
LangChain 实现了一个标准接口,用于大型语言模型和相关技术,如embedding models和向量存储,并与数百个提供商集成
选择OpenAI 聊天模型
pip install -qU "langchain[openai]"
import getpass
import os
if not os.environ.get("OPENAI_API_KEY"):
os.environ["OPENAI_API_KEY"] = getpass.getpass("Enter API key for OpenAI: ")
from langchain.chat_models import init_chat_model
model = init_chat_model("gpt-4o-mini", model_provider="openai")
model.invoke("Hello, world!")
1.1 架构
LangChain 框架由多个开源库组成
langchain-core:聊天模型和其他组件的基础抽象
集成包(例如 langchain-openai、langchain-anthropic 等):重要的集成已拆分为轻量级包,由 LangChain 团队和集成开发者共同维护
langchain:构成应用程序认知架构的Chains、代理和检索策略
langchain-community:由社区维护的第三方集成
langgraph:用于将LangChain组件组合成具有持久性、流式传输和其他关键功能的可用于生产应用程序的编排框架
1.2 概念
Chat models: llm通过聊天API公开,该API将消息序列处理为消息的输入和输出
Messages:聊天模型中的通信单元,用于表示模型的输入和输出
Chat history: 表示为消息序列的对话,在用户消息和模型响应之间交替进行
Tools: 具有关联模式的函数,该模式定义了函数的名称、描述和它接受的参数
Tools calling: 一种聊天模型API,它接受工具模式和消息作为输入,并将对这些工具的调用作为输出消息的一部分返回
Structured output(结构化输出):一种使聊天模型以结构化格式响应的技术,例如与给定模式匹配的JSON
Memory(记忆):关于会话的信息被持久化,以便在以后的会话中使用
多模态:处理不同形式数据的能力,如文本、音频、图像和视频
可运行接口:许多LangChain组件和LangChain表达式语言构建的基本抽象
Streaming:LangChain流api,用于在生成结果时显示结果
LangChain表达式语言(LCEL):用于编排LangChain组件的语法。对于更简单的应用程序最有用
Document loaders(文档加载器):将源加载为文档列表
Retrieval(检索):信息检索系统可以根据查询从数据源检索结构化或非结构化数据
Text splitters(文本分割器):将长文本分割成可以单独索引的小块,以实现粒度检索
Embedding models(嵌入模型):在向量空间中表示文本或图像等数据的模型
Vector stores(向量存储):向量和相关元数据的存储和高效搜索
Retriever(检索器): 一个根据查询从知识库中返回相关文档的组件
检索增强生成(Retrieval Augmented Generation, RAG):一种通过将语言模型与外部知识库结合来增强其能力的技术
代理(Agents):使用语言模型选择要执行的动作序列。代理可以通过工具与外部资源进行交互
提示模板(Prompt templates): 用于提取模型“提示”中的静态部分(通常是一系列消息)的组件。对于序列化、版本控制和重复使用这些静态部分非常有用
输出解析器(Output parsers):负责接收模型的输出并将其转换为更适合下游任务的格式。在工具调用和结构化输出普及之前,输出解析器主要用于处理模型输出
少量样本提示(Few-shot prompting):一种通过在提示中提供少量任务示例来提高模型性能的技术。
示例选择器(Example selectors): 根据给定输入从数据集中选择最相关的示例。在少量样本提示中用于为提示选择示例。
异步编程(Async programming): 在LangChain中使用异步环境时应了解的基础知识。
回调(Callbacks):允许在内置组件中执行自定义辅助代码。在LangChain中用于从LLM流式传输输出、跟踪应用程序的中间步骤等。
追踪(Tracing):记录应用程序从输入到输出所采取步骤的过程。对于调试和诊断复杂应用程序中的问题至关重要。
评估(Evaluation):评估AI应用程序的性能和有效性的过程。这包括测试模型响应是否符合一套预定义的标准或基准,确保满足所需的质量标准并实现预期目标。此过程对于构建可靠的应用程序至关重要。
测试(Testing):验证集成或应用程序的一个组件是否按预期工作的过程。对于确保应用程序行为正确以及代码库的变化不会引入新错误至关重要
1.3 术语
AIMessageChunk:来自AI消息的部分响应。用于从聊天模型流式传输响应时
AIMessage:表示来自AI模型的完整响应
astream_events:从LCEL链中流式传输粒度信息
BaseTool:LangChain中所有工具的基类
batch:用于使用批处理输入执行可运行对象
bind_tools:允许模型与工具交互
Caching:存储结果以避免对聊天模型进行冗余调用
Chat models:处理多种数据模式的聊天模型
Configurable runnables:创建可配置的Runnable(可运行对象)
Context window:聊天模型可以处理的最大输入大小
Conversation patterns:聊天互动中的常见模式
Document:LangChain中文档的表现形式
Embedding models:为各种数据类型生成向量嵌入的模型
HumanMessage:表示来自人类用户的消息
InjectedState:注入到工具函数中的状态
InjectedStore:可以注入到工具中以实现数据持久化的存储
InjectedToolArg:将参数注入工具函数的机制
input and output types:在Runnables中用于输入和输出的类型
Integration packages:与LangChain集成的第三方包
Integration tests:验证组件间交互正确性的测试,通常在有权访问支持集成的基础API的情况下运行
invoke:调用Runnable的标准方法
JSON mode:以JSON格式返回响应
langchain-community:社区驱动的LangChain组件
langchain-core:核心langchain包。包括基础接口和内存中的实现
langchain:一个用于高级组件的包(例如,一些预构建的链)
langgraph:LangChain的强大编排层。用于构建复杂的管道和工作流
langserve:用于将LangChain Runnables部署为REST端点。使用FastAPI。主要适用于LangChain Runnables,当前不与LangGraph集成
LLMs (legacy):旧版语言模型,接受字符串作为输入并返回字符串作为输出
Managing chat history:管理和维护聊天历史的技术
OpenAI format:OpenAI的聊天模型消息格式
Propagation of RunnableConfig:通过Runnables传播配置。如果你正在使用Python 3.9、3.10和异步编程,请阅读此内容
rate-limiting:客户端对聊天模型的速率限制
RemoveMessage:用于从聊天历史中删除消息的抽象,主要用于LangGraph
role:代表聊天消息的角色(如用户、助手)
RunnableConfig:用于传递运行时信息给Runnables(例如run_name, run_id, 标签, 元数据, 最大并发数, 递归限制, 可配置项)
Standard parameters for chat models: 参数如API key, temperature, and max_tokens
Standard tests:一套定义好的单元和集成测试,所有集成都必须通过这些测试
stream:用于从Runnable或图中流式传输输出
Tokenization:数据转换为标记及反之亦然的过程
Tokens:语言模型读取、处理并在底层生成的基本单位
Tool artifacts:添加到工具输出的工件,不会发送到模型,但可用于下游处理
Tool binding:将工具绑定到模型
@tool:用于在LangChain中创建工具的装饰器
Toolkits:可以一起使用的工具集合
ToolMessage:表示包含工具执行结果的消息
Unit tests:验证单个组件正确性的测试,在没有网络访问的隔离环境中运行
Vector stores:专门用于存储和高效搜索向量嵌入的数据存储
with_structured_output:对于原生支持工具调用以获取符合特定模式的结构化输出的聊天模型的帮助方法,该模式可通过Pydantic、JSON schema或函数指定
with_types:一种覆盖Runnable输入和输出类型的便捷方法。在处理复杂的LCEL链和部署时与LangServe一起使用特别有用
1.4 LangChain实战
(使用聊天模型和prompt 模板构建一个LLM APP)
创建环境文件 (.env)
SILICONFLOW_API_KEY=your_api_key_here
实现代码
import os
from typing import Any, Dict, List, Optional
import requests
from dotenv import load_dotenv
from langchain_core.callbacks import CallbackManagerForLLMRun
from langchain_core.language_models import BaseLLM
from langchain_core.outputs import LLMResult
from langchain_core.prompts import PromptTemplate
# 加载环境变量
load_dotenv()
class SiliconFlowDeepSeekLLM(BaseLLM):
"""
自定义硅基流动API封装的DeepSeek-V3 LLM
"""
def _generate(self, prompts: list[str], stop: Optional[list[str]] = None,
run_manager: Optional[CallbackManagerForLLMRun] = None, **kwargs: Any) -> LLMResult:
from langchain_core.outputs import Generation, LLMResult
generations = []
for prompt in prompts:
text = self._call(prompt, stop=stop, **kwargs)
generations.append([Generation(text=text)])
return LLMResult(generations=generations)
@property
def _llm_type(self) -> str:
return "siliconflow-deepseek-v3"
def _call(
self,
prompt: str,
stop: Optional[List[str]] = None,
run_manager: Optional[CallbackManagerForLLMRun] = None,
**kwargs: Any,
) -> str:
# API配置
api_key = os.getenv("SILICONFLOW_API_KEY")
api_url = "https://api.siliconflow.cn/v1/completions"
# 请求头
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
# 请求体(根据API文档调整参数)
data = {
"model": "deepseek-ai/DeepSeek-V3",
"prompt": prompt,
"max_tokens": 1024,
"temperature": 0.7,
"stream": False
}
# 发送请求
response = requests.post(api_url, headers=headers, json=data)
response.raise_for_status()
# 解析响应
return response.json()["choices"][0]["text"]
@property
def _identifying_params(self) -> Dict[str, Any]:
return {"model": "deepseek-ai/DeepSeek-V3"}
# 创建提示模板
prompt_template = PromptTemplate.from_template(
"""你是一个有用的AI助手。根据对话历史和最新输入进行回复。
历史对话:
{history}
最新输入:{input}
助手:"""
)
# 初始化LLM Chain
llm = SiliconFlowDeepSeekLLM()
chain = prompt_template | llm
# 运行聊天循环
history = []
while True:
user_input = input("\n用户: ")
if user_input.lower() in ["exit", "quit"]:
break
# 生成回复
response = chain.invoke({
"input": user_input,
"history": "\n".join(history[-5:]) # 保留最近5轮对话
})
# 更新历史
history.append(f"用户: {user_input}")
history.append(f"助手: {response}")
print(f"\n助手: {response}")
执行效果:
一个简答的基于Langchain的 LLM app实现,更多特性可以直接基于官方文档查看学习
2. LLM 应用开发平台dify
2.1 dify安装
http://github.com/langgenius/dify
cd dify
cd docker
cp .env.example .env
docker compose up -d
1. 初始化设置界面:
http://localhost/install
2. 设置dify管理员账号
3. dify中设置模型,这里使用的是硅基流动模型提供商
2.2 设置知识库
进入知识库,创建一个新的知识库,导入自己的知识数据, 这里我导入数仓的所有表、离线任务和superset报表数据集作为知识库样本,
等待向量化处理完成
等待索引完成
2.3 搭建dify工作流
点击新建应用,选择chatflow,新建一个下面的工作流
整体流程: 调用模型 --> 查找知识库-->给出回答
工作创建好后,点击发布运行,一个LLM应用就发布了
3. dify 跟LangChain的区别
3.1 设计理念与目标用户
Dify:是低代码 AI 开发平台,强调易用性和快速开发,有直观的可视化界面,通过简单地拖拽和组合不同的模块来构建 Agent,即使是非技术人员也能参与到 AI 应用的定义和数据运营过程中。
LangChain:是开源的 Python 库,主要面向有编程经验的开发者,需要编写代码来定义逻辑、集成数据源以及协调大语言模型与其他组件之间的交互,更适合对代码编写有较高要求、希望深度定制 Agent 功能的开发者。
3.2 功能特点
Dify:具有高度的模型兼容性,能与多种不同的模型进行集成。提供完整的应用开发流程支持,从 Agent 的创建、配置到部署一站式完成。还为 RAG 提供了便捷的集成平台,方便开发者将 RAG 技术融入到 Agent 开发中。
LangChain:专注于构建与语言模型高效交互的逻辑,提供了一系列丰富的工具和模块,例如用于处理不同类型数据、与各种数据源交互以
及管理 Agent 工作流程的工具等,是实现 RAG 的有力框架,开发者可以利用其工具和模块,轻松地将知识检索功能与大语言模型相结合。
3.3 开发过程
Dify:开发过程简单快捷,通过可视化界面和拖拽操作,利用预构建的模型、API 和集成,开发者可以快速组装出所需的 AI 应用功能,无需大量编写代码。
LangChain:遵循以代码为中心的传统开发过程,开发者需要熟练掌握 Python 编程以及 LangChain 框架,通过编写代码来实现各种功能,开发过程相对更复杂,需要更多的时间和精力来学习和实践。
3.4 可靠性与支持