跳到主要内容
LangChain 框架快速入门指南 | 极客日志
Python AI
LangChain 框架快速入门指南 综述由AI生成 LangChain 是基于大语言模型构建端到端应用的框架。文章概述了其六大组件及开源库组成,详细演示了安装配置、基本使用(模型初始化、提示模板、输出解析器)、向量存储与检索链构建、代理工具集成以及通过 LangServe 部署为 REST API 的完整流程。内容涵盖从环境搭建到服务交互的关键步骤,帮助开发者快速上手 LangChain 开发。
竹影清风 发布于 2025/2/7 更新于 2026/6/1 26 浏览LangChain
概述
LangChain 是一个基于大语言模型用于构建端到端语言模型应用的框架,它提供了一系列工具、套件和接口,让开发者使用语言模型来实现各种复杂的任务,如文本到图像的生成、文档问答、聊天机器人等。
LangChain 简化了 LLM 应用程序生命周期的各个阶段:
开发阶段 :使用 LangChain 的开源构建块和组件构建应用程序,利用第三方集成和模板快速启动。
生产化阶段 :使用 LangSmith 检查、监控和评估您的链,从而可以自信地持续优化和部署。
部署阶段 :使用 LangServe 将任何链转化为 API。
参考文档:https://python.langchain.com
六大组件
LangChain 具有六大组件,它们是 LangChain 的基石,它们相互协作,形成一个强大而灵活的系统。
模型(Models) :包含各大语言模型的 LangChain 接口和调用细节,以及输出解析机制。
提示模板(Prompts) :使提示工程流线化,进一步激发大语言模型的潜力。
数据检索(Indexes) :构建并操作文档的方法,接受用户的查询并返回最相关的文档,轻松搭建本地知识库。
记忆(Memory) :通过短时记忆和长时记忆,在对话过程中存储和检索数据,让 ChatBot 记住你。
链(Chains) :LangChain 中的核心机制,以特定方式封装各种功能,并通过一系列的组合,自动而灵活地完成任务。
代理(Agents) :另一个 LangChain 中的核心机制,通过'代理'让大模型自主调用外部工具和内部工具,使智能 Agent 成为可能。
英文 中文 说明 Models 模型 LangChain 和大模型的接口 Chains 链 LangChain 对各种组件的封装和调用链条 Prompts 提示 输入大模型的提示模板 Indexes 索引 非结构化数据的查找和访问 Memory 记忆(内存) 与大模型聊天过程中记忆信息 Agents 代理 自主计划和执行的机制
开源库组成
LangChain 框架由以下开源库组成:
langchain-core:基础抽象和 LangChain 表达式语言
langchain-community:第三方集成。合作伙伴包(如 langchain-openai、langchain-anthropic 等),一些集成已经进一步拆分为自己的轻量级包,只依赖于 langchain-core
langchain:构成应用程序认知架构的链、代理和检索策略
langgraph:通过将步骤建模为图中的边和节点,使用 LLMs 构建健壮且有状态的多参与者应用程序
langserve:将 LangChain 链部署为 REST API
LangSmith:一个开发者平台,可让您调试、测试、评估和监控 LLM 应用程序,并与 LangChain 无缝集成
LangChain 基本使用 构建一个 LangChain 应用程序来熟悉该框架。
安装 LangChain 安装指定版本的 LangChain,这里安装截止目前的最新版本。
pip install langchain==0.1 .7
执行安装 LangChain 命令后,会自动安装以下相关组件。
Installing collected packages: langsmith, langchain-core, langchain-text-splitters, langchain-community, langchain
pip install --upgrade langchain
安装 LangChain 时包括常用的开源 LLM(大语言模型)库。
pip install langchain[llms]
配置环境变量 pip install langchain langchain_openai
import os
os.environ["OPENAI_BASE_URL" ] = "https://xxx.com/v1"
os.environ["OPENAI_API_KEY" ] = "YOUR_API_KEY"
基本使用
from langchain_openai import ChatOpenAI
llm = ChatOpenAI()
llm.invoke("LangSmith 是什么?" )
AIMessage(content='LangSmith 是一个虚构的名字,没有具体的定义或含义。它可能是一个人的名字、一个公司的名称或者一种产品的品牌。', response_metadata={'token_usage': {'completion_tokens': 44, 'prompt_tokens': 14, 'total_tokens': 58}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, id='run-f39ca76e-06ef-4815-ba7e-4a4924ef8e48-0')
使用提示模板 使用提示模板来指导其响应。提示模板将原始用户输入转换为更好的 LLM 输入。
from langchain_openai import ChatOpenAI
llm = ChatOpenAI()
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system" , "您是世界级的技术文档编写者。" ),
("user" , "{input}" )
])
chain = prompt | llm
chain.invoke({"input" : "Langsmith 如何帮助进行测试?" })
虽然它依然不知道答案,但对于技术作者来说,它使用了更恰当的语气给予回应。
AIMessage(content='Langsmith 可以帮助测试团队进行测试的文档编写工作。作为一名世界级的技术文档编写者,我可以为您提供以下帮助:\n\n1. 编写测试计划:根据项目需求,我可以帮助您编写详细的测试计划,包括测试目标、测试范围、测试资源、测试策略等内容。\n\n2. 编写测试用例:我可以帮助您编写全面的测试用例,覆盖各种功能、场景和边界条件。测试用例将详细描述每个测试步骤、预期结果和实际结果。\n\n3. 编写测试报告:在测试完成后,我可以帮助您编写清晰、详细的测试报告,包括测试执行情况、发现的缺陷、测试总结等内容。\n\n4. 优化测试文档:如果您已经有测试文档,但希望对其进行优化,使其更加规范、易读、易理解,我也可以提供帮助。\n\n无论您需要哪方面的帮助,我都可以根据您的具体需求提供定制化的服务。请告诉我您的具体要求,我将尽力满足您的需求。', response_metadata={'token_usage': {'completion_tokens': 355, 'prompt_tokens': 39, 'total_tokens': 394}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, id='run-b2ed1dbe-b57e-4472-ab19-61536a238c8d-0')
使用输出解析器 添加一个简单的输出解析器,将聊天消息转换为字符串。
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
llm = ChatOpenAI()
prompt = ChatPromptTemplate.from_messages([
("system" , "您是世界级的技术文档编写者。" ),
("user" , "{input}" )
])
output_parser = StrOutputParser()
chain = prompt | llm | output_parser
chain.invoke({"input" : "Langsmith 如何帮助进行测试?" })
'Langsmith 可以帮助测试团队进行测试的文档编写工作。作为一名世界级的技术文档编写者,我可以为您提供以下帮助:\n\n1. 编写测试计划:根据项目需求,我可以帮助您编写详细的测试计划,包括测试目标、测试范围、测试资源、测试策略等内容。\n\n2. 编写测试用例:我可以帮助您编写全面的测试用例,覆盖各种功能、场景和边界条件。测试用例将详细描述每个测试步骤、预期结果和实际结果。\n\n3. 编写测试报告:在测试完成后,我可以帮助您编写清晰、详细的测试报告,包括测试执行情况、发现的缺陷、测试总结等内容。\n\n4. 优化测试文档:如果您已经有测试文档,但希望对其进行优化,使其更加规范、易读、易理解,我也可以提供帮助。\n\n无论您需要哪方面的帮助,我都可以根据您的具体需求提供定制化的服务。请告诉我您的具体要求,我将尽力满足您的需求。'
向量存储 加载要索引的数据,需要安装 BeautifulSoup。
pip install beautifulsoup4
将其索引到向量存储中。这需要一些组件,即嵌入模型和向量存储。
使用一个简单的本地向量存储 FAISS,首先需要安装它。
from langchain_community.document_loaders import WebBaseLoader
loader = WebBaseLoader("https://docs.smith.langchain.com/user_guide" )
docs = loader.load()
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
from langchain_community.vectorstores import FAISS
from langchain_text_splitters import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter()
documents = text_splitter.split_documents(docs)
vector = FAISS.from_documents(documents, embeddings)
检索链
已在向量存储中索引了这些数据,接下来要创建一个检索链。该链将接收一个传入的问题,查找相关文档,然后将这些文档与原始问题一起传递给 LLM,要求它回答原始问题。
创建一个链,该链接受一个问题和检索到的文档并生成一个答案。
from langchain.chains.combine_documents import create_stuff_documents_chain
prompt = ChatPromptTemplate.from_template("""仅根据提供的上下文回答以下问题:
<context>
{context}
</context>
Question: {input}""" )
document_chain = create_stuff_documents_chain(llm, prompt)
from langchain_core.documents import Document
text = "langsmith can let you visualize test results"
document_chain.invoke({
"input" : "Langsmith 如何帮助进行测试?" ,
"context" : [Document(page_content=text)]
})
'LangSmith 提供了多种方式来帮助进行测试。\n\n首先,LangSmith 支持开发人员创建数据集,这些数据集是输入和参考输出的集合,并使用这些数据集在他们的 LLM 应用程序上运行测试。开发人员可以批量上传、动态创建或从应用程序跟踪中导出测试用例。此外,LangSmith 还可以轻松运行自定义评估来对测试结果进行评分。\n\n其次,LangSmith 提供比较视图,可以并排查看同一数据点上不同配置的结果。这对于对应用程序的不同版本进行原型设计和更改时非常有用,可以帮助开发人员了解哪个变体的性能更好。\n\n此外,LangSmith 还提供了一个 Playground 环境,可以用于快速迭代和实验。开发人员可以在 Playground 中快速测试不同的提示和模型,并将每次运行记录在系统中以供后续创建测试用例或与其他运行进行比较。\n\n最后,LangSmith 还支持自动化,可以近乎实时地对跟踪执行操作。开发人员可以定义自动化操作,包括评分、发送到注释队列或添加到数据集等。这对于在生产规模上处理跟踪非常有用。'
还可以让文档首先来自刚刚设置的检索器。这样,可以使用检索器动态选择最相关的文档,并将其传递给给定的问题。
from langchain.chains import create_retrieval_chain
retriever = vector.as_retriever()
retrieval_chain = create_retrieval_chain(retriever, document_chain)
response = retrieval_chain.invoke({"input" : "how can langsmith help with testing?" })
print (response["answer" ])
LangSmith can help with testing in several ways.
1. LangSmith allows developers to create datasets, which are collections of inputs and reference outputs, and use these to run tests on their LLM applications. Test cases can be uploaded in bulk, created on the fly, or exported from application traces.
2. LangSmith provides a user-friendly comparison view for test runs. This allows developers to compare the results of different configurations on the same datapoints side-by-side, helping them identify any regressions or improvements.
3. LangSmith supports custom evaluations, both LLM-based and heuristic-based, to score test results.
Overall, LangSmith enables developers to perform test-driven development and evaluate the performance of their LLM applications during the prototyping and beta testing phases.
对话检索链 上面创建的链只能回答单个问题。现在创建一个新链。该链将接收最新的输入和对话历史记录,并使用 LLM 生成搜索查询。
from langchain.chains import create_history_aware_retriever
from langchain_core.prompts import MessagesPlaceholder
prompt = ChatPromptTemplate.from_messages([
MessagesPlaceholder(variable_name="chat_history" ),
("user" , "{input}" ),
("user" , "鉴于上述对话,生成一个搜索查询以查找以获取与对话相关的信息" )
])
retriever_chain = create_history_aware_retriever(llm, retriever, prompt)
from langchain_core.messages import HumanMessage, AIMessage
chat_history = [HumanMessage(content="LangSmith 可以帮助测试我的 LLM 应用程序吗?" ), AIMessage(content="Yes!" )]
retriever_chain.invoke({
"chat_history" : chat_history,
"input" : "告诉我怎么做"
})
还可以创建一个新的链来继续对话,并牢记这些检索到的文档。
prompt = ChatPromptTemplate.from_messages([
("system" , "根据以下上下文回答用户的问题:\n\n{context}" ),
MessagesPlaceholder(variable_name="chat_history" ),
("user" , "{input}" ),
])
document_chain = create_stuff_documents_chain(llm, prompt)
retrieval_chain = create_retrieval_chain(retriever_chain, document_chain)
chat_history = [HumanMessage(content="LangSmith 可以帮助测试我的 LLM 应用程序吗?" ), AIMessage(content="Yes!" )]
retrieval_chain.invoke({
"chat_history" : chat_history,
"input" : "Tell me how"
})
代理的使用 构建代理时要做的第一件事是确定它应该有权访问哪些工具。这里授予代理访问两个工具的权限:
使用创建的检索器,以便代理能够回答有关 LangSmith 的问题。
一个搜索工具,以使代理能够回答需要最新信息的问题。
检索器工具 from langchain.tools.retriever import create_retriever_tool
retriever = vector.as_retriever()
retriever_tool = create_retriever_tool(
retriever,
"langsmith_search" ,
"搜索有关 LangSmith 的信息。对于有关 LangSmith 的任何问题,您必须使用此工具!" ,
)
创建搜索工具 访问,注册账号登录并创建 API 秘钥,然后配置环境变量。
import os
os.environ["TAVILY_API_KEY" ] = "YOUR_TAVILY_API_KEY"
pip install -U langchain-community tavily-python
from langchain_community.tools.tavily_search import TavilySearchResults
search = TavilySearchResults()
创建代理 tools = [retriever_tool, search]
from langchain_openai import ChatOpenAI
from langchain import hub
from langchain.agents import create_openai_functions_agent
from langchain.agents import AgentExecutor
prompt = hub.pull("hwchase17/openai-functions-agent" )
llm = ChatOpenAI(model="gpt-3.5-turbo" , temperature=0 )
agent = create_openai_functions_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True )
使用 Agent 代理
agent_executor.invoke({"input" : "Langsmith 如何帮助进行测试?" })
agent_executor.invoke({"input" : "成都今天天气情况?" })
> Entering new AgentExecutor chain...
Invoking: `tavily_search_results_json` with `{'query': '成都今天天气情况'}`
[{'url': 'http://www.nmc.cn/publish/forecast/ASC/chengdu.html', 'content': '成都天气预报 ; 省份:城市:...制作维护:国家气象中心预报系统开放实验室地址:北京市中关村南大街 46 号邮编:100081. 京公网安备 11040102700100 ...'},
{'url': 'http://www.weather.com.cn/weather/101270101.shtml', 'content': '涂擦 SPF 大于 15、PA+ 防晒护肤品。\n天凉,湿度大,较易感冒。\n天气凉,在户外运动请注意增减衣物。\n无需担心过敏,可放心外出,享受生活。\n建议着厚外套加毛衣等服装。\n天气较好,适合擦洗汽车。\n辐射弱,涂擦
根据天气预报,成都今天的天气情况为晴,气温为 0℃,风力小于 3 级。明天将转为多云,最高气温 12℃,最低气温 0℃,风力小于 3 级。\n\n> Finished chain.'
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage
chat_history = [HumanMessage(content="LangSmith 可以帮助测试我的 LLM 应用程序吗?" ), AIMessage(content="Yes!" )]
agent_executor.invoke({
"chat_history" : chat_history,
"input" : "告诉我怎么做"
})
LangServe 提供服务
概述
LangServe 可以帮助开发人员将 LangChain 应用程序部署为 REST API。使用 LangChain 时不是必定使用 LangServe。
pip install "langserve[all]"
创建服务 创建一个 serve.py 文件。包含为应用程序提供服务的逻辑。由三部分组成:
构建的链的定义
FastAPI 应用程序
为链提供服务的路由的定义,由 langserve.add_routes 命令完成
import os
from typing import List
from fastapi import FastAPI
from langchain import hub
from langchain.agents import AgentExecutor
from langchain.agents import create_openai_functions_agent
from langchain.pydantic_v1 import BaseModel, Field
from langchain.tools.retriever import create_retriever_tool
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_community.vectorstores import FAISS
from langchain_core.messages import BaseMessage
from langchain_openai import ChatOpenAI
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langserve import add_routes
os.environ["TAVILY_API_KEY" ] = "YOUR_TAVILY_API_KEY"
os.environ["OPENAI_BASE_URL" ] = "https://xxx.com/v1"
os.environ["OPENAI_API_KEY" ] = "YOUR_API_KEY"
loader = WebBaseLoader("https://docs.smith.langchain.com/user_guide" )
docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter()
documents = text_splitter.split_documents(docs)
embeddings = OpenAIEmbeddings()
vector = FAISS.from_documents(documents, embeddings)
retriever = vector.as_retriever()
retriever_tool = create_retriever_tool(
retriever,
"langsmith_search" ,
"Search for information about LangSmith. For any questions about LangSmith, you must use this tool!" ,
)
search = TavilySearchResults()
tools = [retriever_tool, search]
prompt = hub.pull("hwchase17/openai-functions-agent" )
llm = ChatOpenAI(model="gpt-3.5-turbo" , temperature=0 )
agent = create_openai_functions_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True )
app = FastAPI(
title="LangChain Server" ,
version="1.0" ,
description="A simple API server using LangChain's Runnable interfaces" ,
)
class Input (BaseModel ):
input : str
chat_history: List [BaseMessage] = Field(
...,
extra={"widget" : {"type" : "chat" , "input" : "location" }}
)
class Output (BaseModel ):
output: str
add_routes(
app,
agent_executor.with_types(input_type=Input, output_type=Output),
path="/agent" ,
)
if __name__ == "__main__" :
import uvicorn
uvicorn.run(app, host="localhost" , port=8000 )
启动服务 执行这个文件启动服务,并在 localhost:8000 上提供服务。
INFO: Started server process [18352]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://localhost:8000 (Press CTRL+C to quit)
__ ___ .__ __. _______ _______. _______ .______ ____ ____ _______
| | / \ | \ | | / _____| / || ____|| _ \ \ \ / / | ____|
| | / ^ \ | \| | | | __ | (----`| |__ | |_) | \ \/ / | |__
| | / /_\ \ | . ` | | | |_ | \ \ | __| | / \ / | __|
| `----./ _____ \ | |\ | | |__| | .----) | | |____ | |\ \----. \ / | |____
|_______/__/ \__\ |__| \__| \______| |_______/ |_______|| _| `._____| \__/ |_______|
LANGSERVE: Playground for chain "/agent/" is live at:
LANGSERVE: │
LANGSERVE: └──> /agent/playground/
LANGSERVE:
LANGSERVE: See all available routes at /docs/
服务交互 每个 LangServe 服务都带有一个简单的内置 UI,用于配置和调用具有流输出和中间步骤可见性的应用程序。
访问:http://localhost:8000/agent/playground/
设置一个客户端,以便以编程方式与我们的服务进行交互。
from langserve import RemoteRunnable
remote_chain = RemoteRunnable("http://localhost:8000/agent/" )
res = remote_chain.invoke({
"input" : "成都今天天气情况怎样?" ,
"chat_history" : []
})
print (res)
相关免费在线工具 RSA密钥对生成器 生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
Mermaid 预览与可视化编辑 基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
随机西班牙地址生成器 随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online