前提

自2025年初以来,我一直在深入研究与AI应用相关的多个领域,包括提示工程、AI编程、AI工作流以及MCP等。这一探索旅程的起点源于Goland AI编程助手的一次试用体验,这次经历彻底改变了我对大型AI模型的看法。

在此之前,我主要将AI视为一种增强搜索功能的工具;然而,通过实际使用后发现,AI技术能够显著提升工作效率,并且正逐步将IT行业的编程转变为更加纯粹的智力活动。
为深化对AI的理解和应用能力,我投入了大量时间和精力进行学习和资料收集。我的学习路径涵盖了从基础的提示工程到更高级的应用如n8n、Dify、Cursor、MCP直至LangChain等多个方面。

尽管这条学习之路看似杂乱无章,但随着理解的加深,我逐渐剔除了那些对我个人职业发展帮助较小的内容,并据此制定了更为精准的学习计划。
对于上述提及的一些具体工具和服务:

  • n8n 和 Dify 以及其他国内类似产品,它们主要服务于非程序员用户,旨在提高日常办公效率,将一系列通用操作进行组件化,用户通过将其组装成工作流的方式完成,对于程序员的话,我认为学习成本较大不如自己写程序满足需求来的快。
  • MCP 技术目前仍处于发展阶段,虽然配置选项丰富,但在现阶段并未展现出显著的工作效率提升效果,因此当前阶段更多地是关注其社区动态和发展趋势。
  • 提示工程的核心在于优化向AI提出的问题方式,以获得更贴近需求的答案。在实践过程中,当遇到需要快速生成有效提示词的情况时,我会借助Kimi的提示词专家服务来辅助完成。

LangChain则是一个面向通用大模型开发的框架,它提供了广泛的知识资源供开发者学习如何构建复杂的AI应用程序。可以说,LangChain已经成为连接不同类型AI模型及其应用场景的重要桥梁之一。
基于以上分析,我认为现在正是重新拾起Python语言技能的好时机,以便更好地参与到这些前沿技术的研究与实践中去。

鉴于在个人开源项目中集成人工智能分析功能的需求,近期我将大部分业余时间投入到AI应用开发的学习中。特别地,我专注于研究目前备受瞩目的框架——LangChain。本文旨在总结这一阶段的学习成果(入门指南),并涵盖以下关键点:

  1. 探讨学习AI应用开发的重要性;
  2. 介绍LangChain的核心概念;
  3. 推荐一些关于LangChain的有效学习资源。

为什么需要学习

在人工智能时代到来之前,IT行业的软件开发通常采用硬编码的方式,将业务流程固化为一套标准化的执行路径。这种编程方法存在若干挑战:

  1. 为了支持后续的运营和维护活动,需要程序员深入了解特定领域的业务需求,并持续优化程序相关的生态系统。然而,人力资源往往成为瓶颈,在业务扩展过程中,部分运营和维护任务可能会被牺牲或简化,依赖于有限的人力资源来应对。
  2. 运营活动中收集的数据多为非结构化形式,这要求人工介入以理解这些信息,并将其转换成结构化的数据格式,以便能够通过自动化工具进行处理。这一过程不仅耗时费力,还可能引入人为错误,影响整体效率与准确性。
  3. 业务逻辑的硬编码虽然能够实现特定功能,但当需求发生变更时,则不可避免地需要对代码进行相应的调整以适应新的需求。

AI通用开发有望解决上述部分问题,通过使用自然语言使AI理解核心逻辑,并由AI自动调用相应的组件来实现任务,总而言之就两个字:提效。

Langchain

从官网入门,实际上会告诉我们三个组件:

LangChain:是一个开发框架,用来开发各种基于大模型的应用。

LangSmith:类似于链路跟踪一样,由LangChain 团队提供的一个SaaS平台,帮助开发者调试、追踪、测试、评估和监控基于大模型的应用。

LangGraph:提供了一种构建 Agent 的方式,把 Agent 的状态流转构建成一个图。LangChain 团队甚至构建了一个 IDE:LangGraph Studio,简化这个图的构建过程。

为什么叫做langchain?

在最初阅读入门手册时,我并未完全理解其背后的原因,因为LangChain的官方网站上对此没有明确说明。而是在进一步查阅学习资料的过程中,我发现一些教程,在开篇介绍部分,提供了以下示例代码:

prompt_template = ChatPromptTemplate.from_messages(
    [
        ("system", "Translate the following from English into Chinese:"),
        ("user", "{text}")
    ]
)

model = ChatOpenAI(model="gpt-3.5-turbo")
parser = StrOutputParser()

chain = prompt_template | model | parser
result = chain.invoke({"text":"Welcome to LLM application development!"})
print(result)

该段落对术语“chain”(链)的命名进行了详细解释,指出其来源于LangChain表达式语言(LangChain Expression Language, 简称LCEL)。这种编程风格借鉴了Linux系统中管道符“|”的概念,通过将多个操作步骤串联起来以实现特定功能。具体到上述示例代码中,流程如下:

  1. 首先由用户输入信息(自然语言);
  2. 这些输入被传递给模型进行处理并生成响应;
  3. 系统解析此响应,并按照预定义格式输出结果。

应用架构图如下:

下面来逐步分析下内部核心。

Prompt

为了使大型语言模型更准确地理解您的需求,可以将提示词按照更加结构化和具体化的格式进行表述。

如果将大模型比作是您的下属或助手,那么您作为“老板”在提出需求时应该遵循一定的框架以确保信息传达的清晰度与准确性。

一个有效的提示词构建方法可以参考以下公式:定义角色+提供背景信息+明确任务目标+指定输出要求。
例如,如果您希望得到一篇关于深圳近期天气情况下的穿衣建议文案,您可以这样构造提示词:“请扮演一位气象分析专家的角色,基于过去十五天深圳市的天气数,撰写一份不少于300字的穿衣指南。该指南应考虑到不同时间段(如早晚温差)以及特定活动(比如户外运动)的需求,并给出相应的着装建议。”
通过这种方式,不仅能够帮助大模型更好地理解和执行您的指令,同时也能提高最终成果的质量与适用性。

提示性工程:通过精心设计提示词(Prompt)来引导大型语言模型(LLM)生成符合预期的响应,其核心目标是通过结构化输入优化模型的输出质量;

比如:

from langchain.chat_models import init_chat_model
from langchain.prompts import ChatPromptTemplate
model = init_chat_model("gpt-3.5-turbo", model_provider="openai")
system_template = "Translate the following from English into {language}"
prompt_template = ChatPromptTemplate.from_messages([
    ("system", system_template),
    ("user", "{text}"),
])
prompt = prompt_template.invoke({"language": "Italian", "text": "hi!"})
print(prompt.to_messages())

prompt = prompt_template.invoke({"language": "Chinese", "text": "hi!"})
response = model.invoke(prompt)
print(response.content)

输出如下:

# python .\chat-prompt.py
Ciao!
喂!

常用模板类型

模板类型 适用场景 示例
PromptTemplate 简单文本生成(单轮问答) 解释{概念},用小学生能理解的语言
ChatPromptTemplate 多角色对话(如客服系统) 组合System/User/Assistant消息
FewShotPromptTemplate 少样本学习(风格迁移) 提供3-5个问答示例引导格式

可以在:langchain.prompts 中寻找其他类型;

Model

作为核心,其就是大模型本身,在代码中来声明使用的大模型的来源以及模型名称,但是存在多种引入方式:

直接实例化ChatModel子类

from langchain_openai import ChatOpenAI
# 配置OpenAI模型
gpt_model = ChatOpenAI(
    model_name="gpt-3.5-turbo", 
    temperature=0.5,
)

统一接口初始化(多模型兼容)

from langchain.chat_models import init_chat_model

# 自动推断厂商(需安装对应SDK)
gpt_model = init_chat_model("gpt-4o", temperature=0)  # 推断为OpenAI

原生SDK调用(高级场景)


from openai import OpenAI
# 原生OpenAI调用
client = OpenAI(api_key=apikey, base_url=base_url)
response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": "你好"}]
)

优先选择ChatModel子类,在90%的场景下(如文档问答、智能体开发),直接调用厂商提供的类能简化开发流程。

动态切换时使用init_chat_model。

而原生SDK只有需要访问需要访问未封装的API特殊功能才作选择;

Chain

通过 “Chain” 来链接LangChain的各个组件和功能。在langchain中定义了非常多的chain,比如最简单的chain:LLMChain,在上面例子则就是LLMChain。

各类的Chain的使用可以在:langchain.chains 库找到更加复杂场景的使用;

Agent

通常情况下,大规模语言模型是基于预设的预训练数据集进行训练的。这意味着在实际应用中,这些模型无法自主更新其知识库,从而可能导致生成内容出现不准确或虚构的现象,例如将某位作家的作品错误地归因于另一位作家(如误称老舍撰写了《朝花夕拾》)。因此,开发一种机制使这类模型能够主动获取最新信息并提供精准答案显得尤为重要。
为此,在使用DeepSeek、Kimi或ChatGPT等工具时,可以考虑引入两种操作模式的选择:在线检索与深度推理。通过开启在线检索功能,模型能够访问互联网上的资源以补充其现有知识库;而启用深度推理则允许模型利用其内部逻辑和已有知识进行更复杂的分析。这种结合了外部信息搜索能力与自身理解力的方法,实际上构建了一种智能代理(agent)系统,有助于提高回答问题时的准确性和时效性。

Agent是LangChain的智能决策中枢,扮演协调者角色,通过动态调用工具链完成复杂任务。其工作流程包括:

输入理解:解析用户意图(如自然语言查询)(观察)

计划制定:基于ReAct框架选择执行路径(思考)

工具调用:触发API、数据库或计算工具(如llm-math)(执行)

结果整合:聚合多工具输出生成最终响应。

如果问题比较复杂,那么进一步会变成:观察->思考->执行->再观察。

示例如下:

from langchain_openai import ChatOpenAI
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_core.messages import HumanMessage
from langgraph.prebuilt import create_react_agent
# 创建模型
model = ChatOpenAI(model_name="gpt-3.5-turbo")
# 创建搜索工具
search = TavilySearchResults(max_results=2)
# 创建工具列表
tools = [search]
# 使用代理
config = {"configurable": {"thread_id": "abc123"}}
# 创建代理
agent_executor = create_react_agent(model, tools)
for step in agent_executor.stream(
    {"messages": [HumanMessage(content="hi !明天深圳天气怎么样?")]},
    config,
    stream_mode="values",
):
    step["messages"][-1].pretty_print()

回答如下:

================================ Human Message =================================

hi !明天深圳天气怎么样?
================================== Ai Message ==================================
Tool Calls:
  tavily_search_results_json (chatcmpl-tool-d59a0e32b846449a8a0b3c67e2626b7c)
 Call ID: chatcmpl-tool-d59a0e32b846449a8a0b3c67e2626b7c
  Args:
    query: 明天深圳天气
================================= Tool Message =================================
Name: tavily_search_results_json
[{"title": "预报- 深圳 - 中国天气网", "url": "https://www.weather.com.cn/weather/101280601.shtml", "content": "15日(今天)\n    =======\n晴\n16℃\n<3级\n\n\n16日(明天)\n    =======\n晴\n27℃/16℃\n<3级转3-4级\n\n\n17日(后天)\n    =======\n晴\n24℃/15℃\n3-4级\n\n\n18日(周二)\n    =======\n晴转多云\n23℃/14℃\n3-4级转<3级\n\n\n19日(周三)\n    =======\n多云\n23℃/14℃\n<3级\n\n\n20日(周四)\n    =======\n多云\n24℃/15℃\n<3级\n\n\n21日(周五)\n    =======\n多云\n22℃/14℃\n<3级\n\n\n分时段预报 生活指数\n蓝天预报\n蓝天预报综合天气现象、能见度、空气质量等因子,预测未来一周的天空状况。\n\n天空蔚蓝 可见透彻蓝天,或有蓝天白云美景。\n天空淡蓝 天空不够清澈,以浅蓝色为主。\n天空阴沉 阴天
或有雨雪,天空灰暗。\n\n天空灰霾 出现霾或沙尘,天空灰蒙浑浊。\n\n\n少发 _感冒指数_无明显降温,感冒机率较低。\n\n\n适宜 _运动指数_天气较好,尽情感受运动的快乐吧。\n\n\n不易发 _过敏指数_除特殊体质,无需担心过敏问题。 [...] 深圳天 
气预报,深圳7天天气预报,深圳15天天气预报,深圳天气查询\n首页 预报 预警 雷达 云图 天气地图 专业产品 资讯 视频 节气 我的天空\n更多\n台风路径 空间天气 图片 专题 环境 旅游 碳中和 气象科普 一带一路 产创平台\n\n\n\n国内 本地 国际\n热门 
城市\n北京 上海 成都 杭州 南京 天津 深圳 重庆 西安 广州 青岛 武汉\n热门景点\n故宫 阳朔漓江 龙门石窟 野三坡 颐和园 九寨沟 东方明珠 凤凰古城 秦始皇陵 桃花源\n选择省市\n高球\n佘山 春城湖畔 华彬庄园 观澜湖 依必朗 旭宝 博鳌 玉龙雪山 
番禺南沙 东方明珠\n<<返回 全国\n河北下辖区域\n\n周边城市\n周边景点\n本地乡镇\n\n热门城市\n曼谷 东京 首尔 吉隆坡 新加坡 巴黎 罗马 伦敦 雅典 柏林 纽约 温哥华 墨西哥城 哈瓦那 圣何塞 巴西利亚 布宜诺斯艾利斯 圣地亚哥 利马 基多 悉尼  
墨尔本 惠灵顿 奥克兰 苏瓦 开罗 内罗毕 开普敦 维多利亚 拉巴特\n选择洲际\n亚洲 欧洲 北美洲 南美洲 非洲 大洋洲\n\n全国> 广东 > 深圳> 城区\n\n今天\n7天\n8-15天\n40天\n\n雷达图", "score": 0.7946564}, {"title": "深圳 - 中国气象局-天气
预报-城市预报", "url": "https://weather.cma.cn/web/weather/59493.html", "content": "主站首页\n领导主站\n部门概况\n新闻资讯\n信息公开\n服务办事\n天气预报\n首页\n天气实况\n气象公报\n气象预警\n城市预报\n天气资讯\n气象专题\n气象科普
\n 首页 国内 广东 深圳\n国内 \n|\n广东 \n|\n深圳 \n更新\n \n           \n7天天气预报(2025/02/08 08:00发布)\n星期六\n02/08\n多云\n无持续风向\n微风\n16℃\n7℃\n多云\n无持续风向\n微风\n星期日\n02/09\n晴\n无持续风向\n微风\n17℃\n7℃\n晴\n无持续风向\n微风\n星期一\n02/10\n多云\n无持续风向\n微风\n19℃\n10℃\n多云\n无持续风向\n微风\n星期二\n02/11\n多云\n无持续风向\n微风\n21℃\n17℃\n多云\n无持续风向\n微风\n星期三\n02/12\n多云\n无持续风向\n微风\n23℃\n17℃\n阴\n无持续 
风向\n微风\n星期四\n02/13\n阴\n无持续风向\n微风\n22℃\n16℃\n阴\n东风\n3~4级\n星期五\n02/14\n多云\n无持续风向\n微风\n21℃\n14℃\n中雨\n无持续风向\n微风\n 时间 11:00   14:00   17:00   20:00   23:00   02:00   05:00   08:00 [...] 天气 
                          \n 气温 13℃ 16℃ 14.5℃   13.2℃   11.5℃   10.4℃   7.8℃    8.7℃\n 降水 无降水 无降水 无降水 无降水 无降水 无降水 无降水 无降水\n 风速 3.3m/s  2.5m/s  2.4m/s  2.1m/s  3m/s    3.3m/s  3.3m/s  3.3m/s\n 风向  
东北风 东北风 东北风 东北风 东北风 东北风 东北风 东北风\n 气压 1022.1hPa   1019.5hPa   1018.5hPa   1020.3hPa   1021.1hPa   1021hPa 1020.5hPa   1021.1hPa\n 湿度 42.4%   42.3%   42.2%   41% 50.4%   47.8%   45.2%   38%\n 云量 10.1%   10.1%   10.1%   16.3%   15.7%   11.8%   10.1%   10.1%\n卫星云图\n降水预报\n天气资讯\n强冷空气将影响中东部地区\n北方大部晴日多风 东部和南部海区风力较大", "score": 0.74541736}]
================================== Ai Message ==================================

明天深圳的天气预报是晴天,最高温度约为27℃,最低温度约为16℃。风力较小,<3级转3-4级。请注意根据天气变化调整着装。

经过分析,确定需要运用搜索工具进行信息检索。随后,调用了相应的搜索工具,并基于该工具返回的结果进行了整理与综合,最终形成了输出内容。

Memory

在之前分析Deepseek卡慢问题中,可以得知ChatModel大多数采用SSE技术进行对话的实现,SSE又是建立在HTTP/1.1之上,而我们所知HTTP是无状态的报文,那么ChatModel是如何根据上下文来回答的呢?

验证下:

from langchain_openai import ChatOpenAI
# 配置OpenAI模型
gpt_model = ChatOpenAI(
    model_name="gpt-3.5-turbo", 
    temperature=0.5,
)

response = gpt_model.invoke("你好, 我叫小唐")
print(response.content)

response = gpt_model.invoke("请问我叫什么名字?")
print(response.content)

#output
# python .\chat-memory.py
# 你好,小唐!很高兴认识你。有什么事情我可以帮助你的吗?
# 您还没有告诉我您的名字。您可以告诉我您的名字吗?或者,如果您是想在对话中使用一个特定的名字,请直接告诉我,我很乐意称呼您。

根据当前的响应分析,该系统缺乏上下文记忆能力。因此,为了增强其功能,我们建议集成Memory组件。

Memory:记录了之前的对话上下文,并且把这个上下文作为提示的一部分,在最新的调用中传递给了模型。那么其每次将之前对话都传入到请求中,势必会造成大模型Max Token的限制,所以memory分为以下两类:

短期记忆:ConversationBufferMemory保存最近对话(如最后5轮),防止Token超限;

长期记忆:ConversationSummaryMemory生成摘要持久化存储,支持跨会话调用;

这些是Langchain之前提供的记忆方式,还存在一种第三方框架:mem0,可以作为了解,其将所有的对话都存入到了向量数据库,而每次对象agent都可以去向量数据库中进行搜索历史对话,再做出回答。

Tools

工具在LangChain Agent中扮演着关键角色,不仅限于LangChain自带的工具箱和用户自定义工具,还有一种更加通用但尚处于发展阶段、目前使用起来较为复杂的实现方式——MCP(多组件平台)。在Agent相关章节里,通过声明Search工具,使得Agent能够利用这一功能进行操作;

同时,在LangChain框架内也支持开发人员根据需求定制专属工具,查看指导:https://python.langchain.com/docs/how_to/custom_tools/

对于那些希望探索更多现成解决方案的人来说,可以访问官方文档来获取当前已集成的各种工具集合的信息。

RAG

RAG 是 Retrieval-Augmented Generation 的缩写,也就是检索增强生成;就是我们在本地检索到相关的内容,把它增强到提示词里,然后再去做内容生成。

我们看看官网举例:


#加载数据-分割数据-向量化-存储-检索-生成回答
from langchain.chat_models import init_chat_model
from langchain_openai import OpenAIEmbeddings
from langchain_core.vectorstores import InMemoryVectorStore

import bs4
from langchain import hub
from langchain_community.document_loaders import WebBaseLoader
from langchain_core.documents import Document
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langgraph.graph import START, StateGraph
from typing_extensions import List, TypedDict
# =====================创建模型=======================
llm = init_chat_model("gpt-3.5-turbo", model_provider="openai")
# =====================创建向量模型=======================
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
# =====================创建向量存储=======================
vector_store = InMemoryVectorStore(embeddings)
# =====================加载数据=======================
loader = WebBaseLoader(
    web_paths=("https://lilianweng.github.io/posts/2023-06-23-agent/",),
    bs_kwargs=dict(
        parse_only=bs4.SoupStrainer(
            class_=("post-content", "post-title", "post-header")
        )
    ),
)
docs = loader.load()

text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
all_splits = text_splitter.split_documents(docs)
# =====================存储向量=======================
_ = vector_store.add_documents(documents=all_splits)

# =====================定义prompt=======================
prompt = hub.pull("rlm/rag-prompt")
# =====================定义状态=======================
class State(TypedDict):
    question: str  # 问题
    context: List[Document]  # 上下文
    answer: str  # 回答

# =====================定义检索函数=======================
def retrieve(state: State):
    retrieved_docs = vector_store.similarity_search(state["question"])
    return {"context": retrieved_docs}

# =====================定义生成函数=======================
def generate(state: State):
    docs_content = "\n\n".join(doc.page_content for doc in state["context"])
    messages = prompt.invoke({"question": state["question"], "context": docs_content})
    response = llm.invoke(messages)
    return {"answer": response.content}

# =====================创建状态图=======================
graph_builder = StateGraph(State).add_sequence([retrieve, generate])
# =====================添加边=======================
graph_builder.add_edge(START, "retrieve")
# =====================编译图=======================
graph = graph_builder.compile()

# =====================执行=======================
response = graph.invoke({"question": "What is Task Decomposition?"})
print(response["answer"])

整体流程可以概括为以下几个步骤:数据加载、数据分割、特征向量化、结果存储、信息检索以及最终的响应生成。

callback

langchain对于各个阶段提供hook机制,通过

from langchain.callbacks.base import BaseCallbackHandler

集成BaseCallbackHandler重写内部方法即可。

其他

缓存

区别于Memory,缓存与计算机工程中的缓存使用一致。对大模型应用而言,缓存是至关重要的,

一方面可以提升访问速度,另一方面,由于每次请求都需要花费token,存在缓存,可以实实在在地节省成本。

而对于大模型而言,分为:

精确缓存:只是在提示词完全相同的情况下才能命中缓存。

语义缓存:根据自然语言的意思进行匹配;

我们该怎样系统的去转行学习大模型 ?

很多想入行大模型的人苦于现在网上的大模型老课程老教材,学也不是不学也不是,基于此,我用做产品的心态来打磨这份大模型教程,深挖痛点并持续修改了近100余次后,终于把整个AI大模型的学习门槛,降到了最低!

您只需要听我讲,跟着我做即可,为了让学习的道路变得更简单,这份大模型教程已经给大家整理并打包,现在将这份 LLM大模型资料 分享出来: 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

一、大模型经典书籍(免费分享)

AI大模型已经成为了当今科技领域的一大热点,那以下这些大模型书籍就是非常不错的学习资源。

二、640套大模型报告(免费分享)

这套包含640份报告的合集,涵盖了大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。(几乎涵盖所有行业)
在这里插入图片描述

三、大模型系列视频教程(免费分享)

在这里插入图片描述

四、2025最新大模型学习路线(免费分享)

我们把学习路线分成L1到L4四个阶段,一步步带你从入门到进阶,从理论到实战。

L1阶段:启航篇丨极速破界AI新时代

L1阶段:我们会去了解大模型的基础知识,以及大模型在各个行业的应用和分析;学习理解大模型的核心原理、关键技术以及大模型应用场景。

L2阶段:攻坚篇丨RAG开发实战工坊

L2阶段是我们的AI大模型RAG应用开发工程,我们会去学习RAG检索增强生成:包括Naive RAG、Advanced-RAG以及RAG性能评估,还有GraphRAG在内的多个RAG热门项目的分析。

L3阶段:跃迁篇丨Agent智能体架构设计

L3阶段:大模型Agent应用架构进阶实现,我们会去学习LangChain、 LIamaIndex框架,也会学习到AutoGPT、 MetaGPT等多Agent系统,打造我们自己的Agent智能体。

L4阶段:精进篇丨模型微调与私有化部署

L4阶段:大模型的微调和私有化部署,我们会更加深入的探讨Transformer架构,学习大模型的微调技术,利用DeepSpeed、Lamam Factory等工具快速进行模型微调。

L5阶段:专题集丨特训篇 【录播课】

全套的AI大模型学习资源已经整理打包,有需要的小伙伴可以微信扫描下方二维码,免费领取

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐