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)

  1. 创建环境文件 (.env)
SILICONFLOW_API_KEY=your_api_key_here
  1. 实现代码
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}")
  1. 执行效果:

一个简答的基于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

初始化设置界面:

http://localhost/install

*设置dify管理员账号

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 可靠性与支持

  • Dify:作为商业平台,有专业团队确保质量,其功能经过实际验证,在高负载和大数据量下表现良好。通过云服务和与企业的紧密合作,能根据实际反馈和数据持续监控和改进平台。
  • LangChain:作为开源项目,依赖社区的集体力量来维护和改进代码库,虽然具有透明度、同行评审和社区驱动改进等优点,但在商业支持的完整性和稳定性上可能不如 Dify

4. Reference

  1. https://python.langchain.com/docs/introduction/
  2. https://docs.dify.ai/

LangChain大模型框架& Dify低代码 AI 开发平台的更多相关文章

  1. 低代码Paas开发平台可以本地实施吗

    低代码Paas开发平台可以本地实施吗?答案是肯定的.虽然低代码开发通常是以云端形式面向用户,也就是我们经常看到到aPaaS,而它也更加倾向于SaaS.但实际上,低代码开发平台是可以支持本地部署的,例如 ...

  2. 百度AI开发平台简介

    AIstudio https://aistudio.baidu.com/aistudio/index 关于AI Studio AI Studio是基于百度深度学习平台飞桨的一站式AI开发平台,提供在线 ...

  3. java通过百度AI开发平台提取身份证图片中的文字信息

    废话不多说,直接上代码... IdCardDemo.java package com.wulss.baidubce; import java.io.BufferedReader; import jav ...

  4. (一)钉钉宜搭低代码应用开发高级认证之远程API调用方法示例

    大家好,我是代号六零一,在此分享近期学习的低代码开发知识~,如有疑问欢迎在评论区下方点评,作者愿与您一道共同探讨: 一.创建数据源 二.请求地址配置 钉钉路径示例:/dingtalk/web/APP_ ...

  5. 声网教育aPaaS 产品灵动课堂:「低代码」开发,15分钟极速上线

    1 月 20 日,声网Agora 在官网正式发布教育行业首款 aPaaS 产品灵动课堂,帮助教育机构和开发者最快 15 分钟上线自有品牌.全功能的在线互动教学平台,节省 90% 开发时间.目前,声网面 ...

  6. 研究大华3G设备接入自主视频开发平台

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/fengshuiyue/article/details/24311977 近期项目上须要接入3G摄像头 ...

  7. 用友低代码开发平台YonBuilder首次亮相DevRun开发者沙龙

    2020年的今天,没有人会再质疑企业上云的必要性与价值所在.从高科技行业到传统领域,大大小小的企业都希望走在变革道路前列,通过企业云加快业务数字化转型,更好地维护和管理企业数据. 然而,大多数企业都很 ...

  8. 华为高级研究员谢凌曦:下一代AI将走向何方?盘古大模型探路之旅

    摘要:为了更深入理解千亿参数的盘古大模型,华为云社区采访到了华为云EI盘古团队高级研究员谢凌曦.谢博士以非常通俗的方式为我们娓娓道来了盘古大模型研发的"前世今生",以及它背后的艰难 ...

  9. 低代码开发Paas平台时代来了

    概述 **本人博客网站 **IT小神 www.itxiaoshen.com 低代码理论 概念 低代码开发基于可视化和模型驱动的概念,结合了云原生和多终端体验技术,它可以在大多数业务场景中,帮助企业显著 ...

  10. 什么是低代码(Low-Code)?

    阿里云 云原生应用研发平台EMAS 彭群(楚衡) 一.前言 如果选择用一个关键词来代表即将过去的2020年,我相信所有人都会认同是"新冠".疫情来得太快就像龙卷风,短短数月就阻断了 ...

随机推荐

  1. MySQL8设置root用户远程访问

    查询当前root状态,默认root的host是localhost use mysql; select user,host from user; update root的host为% update us ...

  2. 使用腾讯云对象存储 COS 作为 Velero 后端存储,实现集群资源备份和还原

    Velero(以前称为 Heptio Ark)是一个开源工具,可以安全地备份和还原,执行灾难恢复以及迁移 Kubernetes 集群资源和持久卷,可以在 TKE 集群或自建 Kubenetes 集群中 ...

  3. 使用 Windows Debugger 调试托管代码

    使用 Windows Debugger 调试托管代码 https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/debugg ...

  4. 【Mybatis】学习笔记02:实现简单的查

    Mybatis02:简单的查 如果你没先去学 增删改 ,然后直接看这篇记录,我想会有些困难.因为该文写的很粗劣,只是简单的截图.所以没基础的建议先去看 [Mybatis]学习笔记01:连接数据库,实现 ...

  5. 在 .NET Core 中使用 ActionBlock 实现高效率的多步骤数据处理

    目录 一.引言 二.ActionBlock介绍 什么是 ActionBlock? ActionBlock 的特点 ActionBlock 的使用场景 ActionBlock 的基本用法 三.假设场景 ...

  6. Markdown转Beamer

    技术背景 在早期我写过一些文章介绍用RMarkdown写Beamer,还有相应的TinyTex配置.后来Xie Yihui大神发文离开了RMarkdown核心团队,想来中文社区的支持力度和活跃度可能会 ...

  7. Qt编写安防视频监控系统57-子模块1设备列表

    一.前言 近期在经历过这次UI大重构以后,很多拆分的功能都以单独的模块的形式出现,以悬停窗体的形式嵌入或者悬浮在主窗体中,这种方式极大的增强了系统的拓展性,客户想要什么模块就开启什么模块,放置到合适的 ...

  8. Android保活从入门到放弃:乖乖引导用户加白名单吧(附7大机型加白示例)

    1.引言 IM在Android上的保活问题经常在即时通讯网的论坛和技术群里被讨论,自从Android 8.0后系统大大降低了后台运行应用的保活容忍度(详见<Android P正式版即将到来:后台 ...

  9. Swagger UI、RESTful简介

    Swagger UI 简介 Swagger UI允许任何人(无论您是开发团队还是最终用户)都可以可视化API资源并与之交互,而无需任何实现逻辑.它是根据您的OpenAPI(以前称为Swagger)规范 ...

  10. C#中如何使用异步编程

    在 C# 中,异步编程主要通过 async 和 await 关键字来实现.异步编程的目的是让程序在执行耗时操作(如 I/O 操作.网络请求等)时不会阻塞主线程,从而提高程序的性能. 1. 异步编程的核 ...