LangChain 基本概念与链式应用解析
LangChain 中的 Chain 指链式操作,用于组合 LLM 任务。框架支持文本总结、文档问答等场景。工作流程包括文件加载、分割、向量化及检索增强生成(RAG)。项目结构包含配置、服务、UI 等模块。核心组件涵盖 Memory、Tools 和 Callbacks,适用于聊天机器人、智能体等多种应用。实际部署需注意向量数据库选择、Embedding 模型优化及缓存机制。

LangChain 中的 Chain 指链式操作,用于组合 LLM 任务。框架支持文本总结、文档问答等场景。工作流程包括文件加载、分割、向量化及检索增强生成(RAG)。项目结构包含配置、服务、UI 等模块。核心组件涵盖 Memory、Tools 和 Callbacks,适用于聊天机器人、智能体等多种应用。实际部署需注意向量数据库选择、Embedding 模型优化及缓存机制。

LangChain 字面意思是长长的链子,在框架中,"Chain"(链)是指链式操作或者序列化操作。它是一种将多个任务或操作按照一定的顺序组合起来,以实现特定目标的方法。在 LangChain 框架中,这个概念主要用于描述一系列基于大型语言模型(LLM)的应用程序。
链式操作通常包括以下几个步骤:
通过将这些操作组合成链式结构,LangChain 允许开发人员灵活地构建各种由 LLM 驱动的应用程序。这种链式结构使得开发者可以轻松地定制和扩展应用程序的功能,同时保持代码的可读性和可维护性。
简单来说,LangChain 就是将 LLM 串联起来进行的一系列链式操作。对于简单的应用来说,孤立地使用 LLM 是没有问题的,但更复杂的应用需要将 LLM 串联起来——要么相互串联,要么与其他组件串联。
LangChain 为这种 "链式" 应用提供了 Chain 接口。我们非常笼统地将链定义为对组件的调用序列,其中可以包括其他链。基本接口如下:
class Chain(BaseModel, ABC):
"""Base interface that all chains should implement."""
memory: BaseMemory
callbacks: Callbacks
def __call__(
self,
inputs: Any,
return_only_outputs: bool = False,
callbacks: Callbacks = None,
) -> Dict[str, Any]:
...
链允许我们将多个组件结合在一起,创建一个单一的、连贯的应用程序。例如,我们可以创建一个链,接受用户输入,用 PromptTemplate 格式化,然后将格式化的响应传递给 LLM。我们可以通过将多个链组合在一起,或将链与其他组件组合在一起,建立更复杂的链。
LLMChain 是最基本的构建块链。它接受一个提示模板,用用户输入的格式化它,并从 LLM 返回响应。
要使用 LLMChain,首先要创建一个提示模板。
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
llm = OpenAI(temperature=0.9)
prompt = PromptTemplate(
input_variables=["product"],
template="What is a good name for a company that makes {product}?",
)
我们现在可以创建一个非常简单的链,它将接受用户的输入,用它来格式化提示,然后将其发送到 LLM。
from langchain.chains import LLMChain
chain = LLMChain(llm=llm, prompt=prompt)
# Run the chain only specifying the input variable.
print(chain.run("colorful socks"))
# Output: Colorful Toes Co.
如果有多个变量,你可以用一个字典一次输入它们。
prompt = PromptTemplate(
input_variables=["company", "product"],
template="What is a good name for {company} that makes {product}?",
)
chain = LLMChain(llm=llm, prompt=prompt)
print(chain.run({
'company': "ABC Startup",
'product': "colorful socks"
}))
# Output: Socktopia Colourful Creations.
你也可以在 LLMChain 中使用一个聊天模型:
from langchain.chat_models import ChatOpenAI
from langchain.prompts.chat import (
ChatPromptTemplate,
HumanMessagePromptTemplate,
)
human_message_prompt = HumanMessagePromptTemplate(
prompt=PromptTemplate(
template="What is a good name for a company that makes {product}?",
input_variables=["product"],
)
)
chat_prompt_template = ChatPromptTemplate.from_messages([human_message_prompt])
chat = ChatOpenAI(temperature=0.9)
chain = LLMChain(llm=chat, prompt=chat_prompt_template)
print(chain.run("colorful socks"))
# Output: Rainbow Socks Co.
主要分为 LLMChain、Sequential Chains、Router Chain 等。
SimpleSequentialChain:只是简单的将多个 LLMChain 串联在一起,前一个 Chain 的输出是后一个 Chain 的输入,所以总体上来说只有一个输入和一个输出。SequentialChain:则具有多个输入或输出,灵活性更高。理解了 Chains 的作用和意义,才能真正理解 LangChain 的作用和意义。LangChain 就像一套乐高积木,可以融合市场上主流的大模型,并且提供了组合调用链路以供使用者快速上手使用,也支持使用者自己定义组装自己的调用链路,以此来满足各种各样的场景需求。因此与其说 LangChain 是个框架和工具,倒不如说 LangChain 是一个设计模式或者理念,使用者不应该拘泥于某一种的使用方式,而是探索在不同的场景中如何让 Chains 更加高效的工作,甚至是自定义自己的 Chains。
LangChain-chatchat 的工作流程示意图如下所示:

工作流程:加载文件 -> 读取文本 -> 文本分割 -> 文本向量化 -> 问句向量化 -> 在文本向量中匹配出与问句向量最相似的 top k 个 -> 匹配出的文本作为上下文和问题一起添加到 prompt 中 -> 提交给 LLM 生成回答。
从文档处理角度来看,实现流程如下:

以 LangChain-Chatchat 为例,其核心目录结构如下:
configs/:配置文件路径。server/:api 服务、大模型服务等服务程序等核心代码。webui_pages/:webui 服务。startup.py:启动脚本。
│ .gitignore
│ CONTRIBUTING.md
│ init_database.py 用于初始化知识库
│ LICENSE
│ README.md
│ release.py
│ requirements.txt
│ requirements_api.txt
│ requirements_webui.txt
│ shutdown_all.sh 一键停止脚本,kill 掉启动的服务
│ startup.py 一键启动
│ webui.py ui 界面启动
├─chains
│ llmchain_with_history.py
├─common
│ __init__.py
├─configs
│ model_config.py.example 模型配置文件,配置使用的 LLM 和 Embedding 模型;
│ server_config.py.example
│ __init__.py
├─embeddings
│ __init__.py
├─knowledge_base
│ └─samples 知识库
│ ├─content
│ │ test.txt 知识库上传的文档
│ └─vector_store 向量化后的知识
│ index.faiss
│ index.pkl
├─nltk_data
├─server
│ │ api.py 用于启动 API 服务
│ │ api_allinone_stale.py
│ │ llm_api.py 用于启动 LLM
│ │ llm_api_shutdown.py
│ │ llm_api_stale.py
│ │ utils.py
│ │ webui_allinone_stale.py
│ │
│ ├─chat
│ │ chat.py 用于与 LLM 模型对话
│ │ knowledge_base_chat.py 用于与知识库对话
│ │ openai_chat.py
│ │ search_engine_chat.py 用于搜索引擎对话
│ │ utils.py
│ │ __init__.py
│ │
│ ├─db 知识库的数据库
│ │ │ base.py
│ │ │ session.py
│ │ │ __init__.py
│ │ ├─models
│ │ │ base.py 数据库表的基础属性
│ │ │ knowledge_base_model.py 知识库模型的表字段
│ │ │ knowledge_file_model.py 知识库文件的表字段
│ │ │ __init__.py
│ │ └─repository
│ │ knowledge_base_repository.py
│ │ knowledge_file_repository.py
│ │ __init__.py
│ │
│ ├─knowledge_base
│ │ │ kb_api.py 知识库 API,创建、删除知识库;
│ │ │ kb_doc_api.py 知识库文件 API,搜索、删除、更新、上传文档,重建向量库;
│ │ │ migrate.py 初始化 or 迁移重建知识库;
│ │ │ utils.py 提供了加载 Embedding、获取文件加载器、文件转 text 的函数,可设置文本分割器;
│ │ │ __init__.py
│ │ └─kb_service
│ │ base.py 向量库的抽象类
│ │ default_kb_service.py
│ │ faiss_kb_service.py faiss 向量库子类
│ │ milvus_kb_service.py
│ │ pg_kb_service.py
│ │ __init__.py
│ │
│ └─static
│
├─tests
│ └─api
│ test_kb_api.py 测试知识库 API
│ test_stream_chat_api.py 测试对话 API
│
├─text_splitter 各种文本分割器
│ ali_text_splitter.py 达摩院的文档分割
│ chinese_text_splitter.py 中文文本分割
│ zh_title_enhance.py 中文标题增强:判断是否是标题,然后在下一段文字的开头加入提示语与标题建立关联。
│ __init__.py
│
└─webui_pages UI 界面构建
│ utils.py 简化 api 调用
│ __init__.py
│
├─dialogue
│ dialogue.py 问答功能,LLM 问答和知识库问答,还有搜索引擎问答;
│ __init__.py
│
├─knowledge_base
│ knowledge_base.py 知识库管理界面构建
│ __init__.py
│
└─model_config
model_config.py 模型配置页面,TODO。应该是可以在界面上手动选择采用哪个 LLM 和 Embedding 模型。
__init__.py

除了 Chain,LangChain 的核心还包括以下组件,它们在构建复杂应用时不可或缺:
在实际生产环境中部署 LangChain 应用时,建议关注以下几点:
随着大模型技术的快速发展,LangChain 也在不断演进。未来的趋势包括:
通过掌握 LangChain 的基本概念与应用,开发者可以更高效地构建基于大模型的智能应用,推动 AI 技术在各行各业的落地。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online