LangChain 框架下的 AI Agent 构建与部署实践

本文将详细介绍并实践以下内容:

  • LangChain 各组件(LLM、工具、链、记忆、Agent、提示、RAG、Retriever 等)在完整项目中的协作关系
  • 结合 DeepSeek + bge-small-zh + FAISS + DuckDuckGoSearch
  • 提供模块化代码示例,说明每部分的职责与灵活性
  • 使用 FastAPI 将 Agent 封装成 API 服务,可用于 Web 前端接入
  • 查漏补缺前几篇中未展开的主题,例如 Tool 封装规范、Agent 执行中间状态管理、复杂提示结构设计等

本系列文章最后一篇将系统讲解如何基于 LangChain 框架构建一个功能齐全、可部署的智能问答 Agent。我们将结合前文核心概念(ReAct 架构、RAG 检索增强、提示工程、工具调用等)逐步展开,选用 DeepSeek 聊天模型作为 LLM、BAAI/bge-small-zh-v1.5 作为中文嵌入模型、FAISS 作为向量数据库、DuckDuckGoSearchRun 作为联网搜索工具,最终封装成 RESTful 服务。

一、LangChain框架概述

  • 什么是LangChain?

LangChain是一个用于开发由语言模型驱动的应用程序的框架。它允许开发者将大型语言模型(LLMs)与其他计算或知识源连接起来,从而创建更强大、更灵活的AI应用。

  • LangChain核心组件

LangChain包含多个核心模块,这些模块可以组合使用来构建复杂的AI Agent:

  • Models:支持多种语言模型接口
  • Prompts:提示管理、优化和序列化
  • Memory:短期和长期记忆管理
  • Indexes:文档加载、处理和检索
  • Chains:调用序列和组合
  • Agents:动态决策和工具使用
  • Callbacks:日志和流式传输

二、核心概念回顾

  • ReAct 框架:是一种将推理(Reasoning)与动作(Action)相结合的交互式提示方式。LangChain 的 ReAct Agent 可以让模型在对话过程中思考 (Thought:)、采取动作 (Action:) 并观察结果 (Observation:),从而动态调用外部工具。例如,当模型面临复杂问题时,可以通过调用搜索工具或数据库工具来获取补充信息,再结合生成能力给出答案。

  • RAG(检索增强生成):指在生成回答时通过检索相关文档来提供上下文或证据的技术。RAG 适用于将领域知识融入对话,避免模型只凭「记忆」回答超出能力的问题。我们会使用向量数据库(FAISS)和文本嵌入来实现 RAG,从海量文档中检索与用户问题最相关的内容,再输入模型生成答案。

  • 提示工程:通过 PromptTemplate 等机制设计和组织模型提示,将任务指令、示例和变量拼接成最终输入。好的提示可以大幅提升模型理解和回答能力。我们将定制提示模板,明确说明用户意图及可用工具等,引导模型在 ReAct 交互中正确使用工具。

  • 工具调用:Agent 能访问的工具(如搜索引擎、知识库查询、计算器等)需封装为符合接口的 Tool 对象,包含名称、调用函数和用途说明。在 ReAct 策略下,模型可以选择某个工具并按指定格式传入参数。本文示例中,将集成联网搜索与本地向量检索两种工具供 Agent 使用。

  • 多轮对话与记忆:使用 ConversationBufferMemory 记录会话历史,实现上下文连续性。当用户提问时,上下文记忆会作为提示变量注入,让模型参考前文对话内容,使回答更具连贯性。

三、系统架构与组件选型

3.1 语言模型与嵌入

  • LLM(聊天模型):选用 DeepSeek 提供的 deepseek-chat 模型作为对话模型。DeepSeek 是一系列开源模型,支持结构化输入、工具调用等能力。DeepSeek API 使用与 OpenAI 兼容的 API 格式,可使用 LangChain 的 ChatOpenAI 进行接入,如下所示:
import os
from langchain_community.chat_models import ChatOpenAI

API_KEY = os.getenv('DEEPSEEK_API_KEY')

llm = ChatOpenAI(
    model='deepseek-chat',  # 指定使用的模型名称,如 gpt-4、deepseek-chat 等
    openai_api_key=API_KEY,  # 设置 API 密钥
    openai_api_base='https://api.deepseek.com/v1',  # 自定义模型地址(如 DeepSeek)
    temperature=0.7,  # 控制输出的随机性,越低越保守,越高越发散
    max_tokens=1024,  # 设置生成回复的最大 token 数
    model_kwargs={  # 额外的模型参数(可选)
        "top_p": 1,
        "frequency_penalty": 0.0,
        "presence_penalty": 0.0
    },
    request_timeout=60,  # 请求超时时间(秒)
    streaming=False,  # 是否使用流式响应
    verbose=False  # 是否打印调试信息
)
✅ 参数使用建议
  1. 温度设置
    • temperature=0.0 适合问答、摘要、代码生成等确定性任务;
    • temperature=0.7~1.0 更适合生成富有创意的内容。
  2. 兼容模型
    • 若使用 DeepSeek、Moonshot、Azure OpenAI 等非官方 API,务必设置 openai_api_base
  3. 高阶用法
    • 可结合 LLMChainAgentExecutor 构建复杂流程。

这样实例化后,llm.invoke([消息列表]) 即可获得模型回复。

response = llm.invoke("请简要说明“量子计算”和“经典计算”的主要区别。")
print(response)

输出:

content='量子计算与经典计算的核心区别主要体现在以下方面:\n\n### 1. **信息表示方式**\n- **经典计算**:使用二进制位(bit),每个bit只能是0或1。\n- **量子计算**:使用量子位(qubit),可处于0、1或两者的叠加态(量子叠加),同时表示多种状态。\n\n### 2. **并行计算能力**\n- **经典计算**:逐次处理任务,N位处理器一次处理一个N位状态。\n- **量子计算**:N个qubit可同时处理2^N个状态(量子并行性),适合大规模并行问题(如因数分解、搜索)。\n\n### 3. **操作原理**\n- **经典计算**:基于布尔逻辑门(AND/OR/NOT等),确定性操作。\n- **量子计算**:通过量子门操作(如Hadamard门、CNOT门),支持叠加态和纠缠态的操作,具有概率性。\n\n### 4. **纠缠与关联性**\n- **经典计算**:比特间独立或通过经典关联。\n- **量子计算**:qubit可纠缠(entanglement),一个qubit状态变化立即影响另一个,即使相距遥远(非局域性)。\n\n### 5. **算法效率**\n- **经典计算**:解决常规问题(如排序、数据库查询)效率高。\n- **量子计算**:特定问题指数级加速,如Shor算法(因数分解)、Grover算法(无序搜索)。\n\n### 6. **错误处理**\n- **经典计算**:通过冗余校验(如重复编码)纠错。\n- **量子计算**:需量子纠错码(如表面码),因量子态脆弱易受退相干影响。\n\n### 7. **物理实现**\n- **经典计算**:基于硅基半导体(CPU/GPU),技术成熟。\n- **量子计算**:需极端环境(超导、离子阱、光量子等),维持量子态难度大。\n\n### 8. **应用领域**\n- **经典计算**:通用计算,覆盖日常需求。\n- **量子计算**:专长于优化、模拟量子系统、密码学等,无法完全替代经典计算。\n\n### 总结\n量子计算利用量子力学特性(叠加、纠缠)突破经典限制,但在通用性和稳定性上仍面临挑战。两者未来可能互补共存,量子处理特定任务,经典负责其余部分。' additional_kwargs={} response_metadata={'token_usage': {'completion_tokens': 499, 'prompt_tokens': 18, 'total_tokens': 517, 'prompt_tokens_details': {'cached_tokens': 0}, 'prompt_cache_hit_tokens': 0, 'prompt_cache_miss_tokens': 18}, 'model_name': 'deepseek-chat', 'system_fingerprint': 'fp_8802369eaa_prod0425fp8', 'finish_reason': 'stop', 'logprobs': None} id='run--95a492b6-37f7-4e73-b5cf-12265c945c46-0'

3.2 文档加载与预处理

在构建 Agent 之前,我们需要先将原始文档转化为可以检索的向量形式,具体包括:

(1)加载本地文档

LangChain 提供多种 Loader 来读取不同格式的文档。

  • 读取 Markdown 文件.md):
from langchain_community.document_loaders import TextLoader

loader = TextLoader('./docs/智能体简介.md', encoding='utf-8')
documents = loader.load()

  • 读取整个目录下的 Markdown 文件
from langchain_community.document_loaders import DirectoryLoader

loader = DirectoryLoader('./docs', glob='**/*.md', loader_cls=TextLoader, loader_kwargs={'encoding': 'utf-8'})
documents = loader.load()

  • 读取 PDF 文件

对于 PDF 文件,可以使用 PyPDFLoader 进行加载。它会按页读取并自动转为 Document 对象。

from langchain_community.document_loaders import PyPDFLoader

loader = PyPDFLoader('./docs/GB+38031-2025.pdf')
documents = loader.load()

如果你希望将多个来源的文档合并处理,只需拼接多个 documents 列表即可:

all_documents = md_documents + pdf_documents + other_documents
(2)文档切分

为了让长文档适配向量数据库,我们需要按段落或语义块进行切分。推荐使用 RecursiveCharacterTextSplitter

from langchain.text_splitter import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50,
    separators=["\n\n", "\n", "。", "!", "?", ".", "!", "?"]
)
split_docs = text_splitter.split_documents(documents)

此操作会将文档拆成多个短文本块,既保留上下文连续性,又便于后续的向量化处理。

3.3 向量化与嵌入模型选型

我们选用了性能与体积兼顾的中文向量模型 —— BAAI/bge-small-zh-v1.5。它支持短语级语义检索,能生成可用于相似度计算的高质量文本向量。

from langchain_community.embeddings import HuggingFaceEmbeddings

# 初始化一个中文 BGE 嵌入模型,用于将文本转换为向量表示
embed_model = HuggingFaceEmbeddings(
    model_name="BAAI/bge-small-zh-v1.5",  # 使用 BAAI 提供的 bge-small-zh 中文语义嵌入模型
    model_kwargs={"device": "cpu"},  # 指定运行设备为 CPU,如有 GPU 可改为 "cuda"
    encode_kwargs={"normalize_embeddings": True}  # 对输出的向量进行归一化,有助于相似度计算
)
  • 嵌入模型(Embedding Model) 的核心功能是将自然语言文本转换为数值向量(embedding),使得我们可以基于向量做相似度检索、聚类、语义匹配等操作。在 LangChain 中,embedding model 通常用于以下两个场景:
  1. 文档入库(embedding + 存入向量数据库)
  2. 用户查询转换(embedding + 相似文档检索)
  3. BGE 模型推荐在 embed_query() 之前添加查询指令(query_instruction),以获得更好的效果。
query_instruction = "为这个句子生成表示以用于检索相关文章:"
question = "人工智能是一门研究如何让计算机具有人类智能的科学"
query = query_instruction + question
vector = embed_model.embed_query(query)  # 得到向量表示(用于查询)
print(vector)

输出:

  • 向量数据库:使用 FAISS 存储文档向量。FAISS 是 Facebook 提供的高效相似度检索库,专门用于密集向量搜索。将待检索的文档列表通过 embed_model 编码后,使用 FAISS.from_documents() 构建向量索引。例如:

1. 将前面切分后的 split_docs 向量化,并存入 FAISS

from langchain.vectorstores import FAISS

vectorstore = FAISS.from_documents(split_docs, embed_model)

# 保存本地索引以供后续检索调用
vectorstore.save_local("faiss_index")

这样即可快速从 FAISS 中根据用户查询检索相关文档。

2. 检索器构造(Retriever)

我们通过 vectorstore.as_retriever() 构造一个语义检索器,支持基于向量相似度的文段召回:

retriever = vectorstore.as_retriever(search_type="similarity", search_kwargs={"k": 4})

query = "电动汽车用动力蓄电池按照8.2.1进行振动试验后应达到什么要求?"
docs = retriever.get_relevant_documents(query)

for i, doc in enumerate(docs, 1):
    print(f"[文档 {i}]: {doc.page_content}\n")
  • retriever 是 LangChain 中统一的文档检索接口,而 vectorstore.as_retriever() 是把底层的向量数据库变成这个接口。
  • search_type:检索方式,默认是 "similarity"(相似度检索),还可以是 "mmr"(最大边际相关性)等。
  • search_kwargs:检索参数,比如 k=3 表示返回前 3 条相似结果。也可以传入 filter 等用于更精细控制的参数。

输出:

3.4 联网搜索工具

使用 DuckDuckGo 搜索工具进行实时查询。LangChain 社区提供了 DuckDuckGoSearchRun 封装,可直接调用 DuckDuckGo API。示例:

from langchain_community.tools import DuckDuckGoSearchRun

search_tool = DuckDuckGoSearchRun()
result = search_tool.invoke("最近一次 SpaceX 火箭发射是什么时候?成功了吗?")

这个工具方便集成到 Agent 中,实现“需要联网搜索”时的补充信息。

3.5 工具系统设计

所有工具统一封装为 Tool 对象,包含名称、执行函数和描述。例如,我们可以准备两个工具:网络搜索 和 向量检索

from langchain.agents import Tool

tools = [
    Tool(
        name="Search",
        func=lambda q: DuckDuckGoSearchRun().invoke(q),
        description="在互联网上搜索答案"
    ),
    Tool(
        name="Lookup",
        func=lambda q: "\n".join([doc.page_content for doc in retriever.get_relevant_documents(q)]),
        description="从本地向量数据库中检索相关文档"
    ),
    # 可扩展其他工具
]

这样 Agent 在对话过程中如果决定“搜索网页”就会调用第一个工具,如果需要“查看知识库”则调用第二个。

四、代码组织与协同方式

按照 LangChain 组件化设计,我们将主要功能模块划分为不同文件或类以便维护:

  • Embedding 模块:负责加载 HuggingFaceBgeEmbeddings 模型并构建 FAISS 数据库。示例代码如上,将用于后续检索。
  • Tool 模块:定义各种工具。可以把搜索和检索函数封装在此,例如前述的 SearchRetrieve
  • Prompt 模板:使用 PromptTemplate 定义 ReAct 提示格式,插入工具列表和对话历史等变量,例如:
from langchain.prompts import PromptTemplate
prompt = PromptTemplate.from_template(
  "你是一个智能问答助手。你可以使用以下工具:\n{tools}\n"
  "请根据用户问题和工具结果给出答案。\n\n"
  "用户问题: {input}\n"
  "{agent_scratchpad}"
)
  • 记忆模块:通过 ConversationBufferMemory 保存对话记录。初始化时指定 memory_key="chat_history",并将该内存作为参数传入 AgentExecutor。
  • Agent 构建:使用 LangChain 的 ReAct Agent 构造器创建可调用的 Agent:

这样得到的 agent_executor.invoke({"input": 用户问题}) 会返回模型对话输出,其中模型可以在生成过程中调用 Search 或 Lookup 等工具,并将返回结果纳入思考。

response = agent_executor.invoke({"input": "中国政府对电动汽车用动力蓄电池有什么新的要求?"})
print(response)

输出:

> Finished chain.
{'input': '中国政府对电动汽车用动力蓄电池有什么新的要求?', 'chat_history': '', 'output': '中国政府对电动汽车用动力蓄电池的新要求包括加强安全性能测试、推行生产者责任延伸制度、鼓励低碳生产、提高技术标准与性能要求,以及实施全生命周期溯源管理。'}

五、FastAPI 封装与示例

完成以上组件后,用 FastAPI 构建 API 服务接口:

from fastapi import FastAPI, Request
app = FastAPI()

@app.post("/chat")
async def chat_api(request: Request):
    data = await request.json()
    query = data.get("query", "")
    # 调用 AgentExecutor 得到回答
    result = agent_executor.invoke({"input": query})
    answer = result["output"]
    return {"answer": answer}

启动服务后,客户端即可通过 POST 请求访问,例如:

curl -X POST http://localhost:8000/chat -H "Content-Type: application/json" -d '{"query":"上海天气怎么样?"}'

上述请求返回的 JSON 会包含智能体的回答。整个服务基于组件化设计,后续可替换模型、增加工具或更换向量数据库,而不影响主逻辑。

六、推荐阅读与项目结构示例

  • 推荐阅读:深入了解 LangChain 文档,如 ReAct Agent 和工具调用机制,探索 LangGraph 新架构;学习 DeepSeek 和 BGE 模型的官方资料。
  • 项目目录及代码详情(以模块化方式组织代码):
ai_agent_demo/
├── agents/
│   └── base_agent.py           # 构建智能体
├── tools/
│   ├── search_tool.py          # 搜索工具(DuckDuckGo)
│   ├── doc_reader.py           # 文档读取工具
│   └── vectorstore.py          # 构建向量数据库
├── multimodal/
│   └── image_captioning.py     # 图像识别/图文描述工具
├── memory/
│   └── memory.py               # 智能体记忆模块(新增)
├── app/
│   └── main.py                 # FastAPI 接口入口
├── sample.pdf                  # 示例文档
├── sample.jpg                  # 示例图像
├── main.py                     # 命令行入口
└── requirements.txt            # 依赖管理

详细代码:ai_agent_demo

命令行交互入口(main.py)

from agents.base_agent import build_agent


def run():
    agent = build_agent()

    print("🔧 智能体已启动... 输入 exit 退出")

    while True:
        user_input = input("\n🧑 用户: ")
        if user_input.lower() in {"exit", "quit"}:
            print("👋 再见!")
            break
        response = agent.invoke(user_input)
        print(f"\n🤖 Agent: {response}")


if __name__ == "__main__":
    run()

输出:

FastAPI 部署接口(app/main.py)

# -*- coding: utf-8 -*-

from fastapi import FastAPI, UploadFile, File
from pydantic import BaseModel
from agents.base_agent import build_agent

app = FastAPI()
agent = build_agent()


class Query(BaseModel):
    query: str


@app.post("/chat")
async def chat(q: Query):
    response = agent.invoke(q.query)
    return {"response": response}


@app.post("/upload")
async def upload_pdf(file: UploadFile = File(...)):
    content = await file.read()
    path = f"temp_{file.filename}"
    with open(path, "wb") as f:
        f.write(content)
    response = agent.invoke(f"请阅读 {path} 文件内容")
    return {"response": response}
uvicorn app.main:app --reload

总结:本文展示了如何将 RAG、工具调用、多轮记忆等技术融合到一个 LangChain Agent 中,结合 DeepSeek 聊天模型和本地向量数据库,实现实用的问答系统。该架构具有良好可扩展性,可根据需求添加更多工具或采用更强大的模型,以满足复杂的应用场景。

 这份《AI产品经理学习资料包》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以在文末CSDN官方认证二维码免费领取【保证100%免费】
资料包: CSDN大礼包:《对标阿里黑客&网络安全入门&进阶学习资源包》免费分享


AI产品经理,0基础小白入门指南
作为一个零基础小白,如何做到真正的入局AI产品?

什么才叫真正的入局?

是否懂 AI、是否懂产品经理,是否具备利用大模型去开发应用能力,是否能够对大模型进行调优,将会是决定自己职业前景的重要参数。

你是否遇到这些问题:
1、传统产品经理

不懂Al无法对AI产品做出判断,和技术沟通丧失话语权
不了解 AI产品经理的工作流程、重点
2、互联网业务负责人/运营
对AI焦虑,又不知道怎么落地到业务中想做定制化AI产品并落地创收缺乏实战指导
3、大学生/小白
就业难,不懂技术不知如何从事AI产品经理想要进入AI赛道,缺乏职业发展规划,感觉遥不可及
为了帮助开发者打破壁垒,快速了解AI产品经理核心技术原理,学习相关AI产品经理,及大模型技术。从原理出发真正入局AI产品经理。

这里整理了一些AI产品经理学习资料包给大家
📖AI产品经理经典面试八股文
📖大模型RAG经验面试题
📖大模型LLMS面试宝典
📖大模型典型示范应用案例集99个
📖AI产品经理入门书籍
📖生成式AI商业落地白皮书

🔥作为AI产品经理,不仅要懂行业发展方向,也要懂AI技术,可以帮助大家:
✅深入了解大语言模型商业应用,快速掌握AI产品技能
✅掌握AI算法原理与未来趋势,提升多模态AI领域工作能力
✅实战案例与技巧分享,避免产品开发弯路

这份《AI产品经理学习资料包》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】
资料包: CSDN大礼包:《对标阿里黑客&网络安全入门&进阶学习资源包》免费分享

AI大模型学习福利
作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

大模型&AI产品经理如何学习
求大家的点赞和收藏,我花2万买的大模型学习资料免费共享给你们,来看看有哪些东西。

1.学习路线图


第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

2.视频教程
网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己整理的大模型视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

(都打包成一块的了,不能一一展开,总共300多集)

因篇幅有限,仅展示部分资料,需要点击CSDN大礼包:《对标阿里黑客&网络安全入门&进阶学习资源包》免费分享前往获取

3.技术文档和电子书
这里主要整理了大模型相关PDF书籍、行业报告、文档,有几百本,都是目前行业最新的。


4.LLM面试题和面经合集
这里主要整理了行业目前最新的大模型面试题和各种大厂offer面经合集。


👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。


1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以CSDN大礼包:《对标阿里黑客&网络安全入门&进阶学习资源包》免费分享免费领取【保证100%免费】🆓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值