前提
自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。本文旨在总结这一阶段的学习成果(入门指南),并涵盖以下关键点:
- 探讨学习AI应用开发的重要性;
- 介绍LangChain的核心概念;
- 推荐一些关于LangChain的有效学习资源。
为什么需要学习
在人工智能时代到来之前,IT行业的软件开发通常采用硬编码的方式,将业务流程固化为一套标准化的执行路径。这种编程方法存在若干挑战:
- 为了支持后续的运营和维护活动,需要程序员深入了解特定领域的业务需求,并持续优化程序相关的生态系统。然而,人力资源往往成为瓶颈,在业务扩展过程中,部分运营和维护任务可能会被牺牲或简化,依赖于有限的人力资源来应对。
- 运营活动中收集的数据多为非结构化形式,这要求人工介入以理解这些信息,并将其转换成结构化的数据格式,以便能够通过自动化工具进行处理。这一过程不仅耗时费力,还可能引入人为错误,影响整体效率与准确性。
- 业务逻辑的硬编码虽然能够实现特定功能,但当需求发生变更时,则不可避免地需要对代码进行相应的调整以适应新的需求。
AI通用开发有望解决上述部分问题,通过使用自然语言使AI理解核心逻辑,并由AI自动调用相应的组件来实现任务,总而言之就两个字:提效。
Langchain
从官网入门,实际上会告诉我们三个组件:
LangChain:是一个开发框架,用来开发各种基于大模型的应用。
LangSmith:类似于链路跟踪一样,由LangChain 团队提供的一个SaaS平台,帮助开发者调试、追踪、测试、评估和监控基于大模型的应用。
LangGraph:提供了一种构建 Agent 的方式,把 Agent 的状态流转构建成一个图。LangChain 团队甚至构建了一个 IDE:LangGraph Studio,简化这个图的构建过程。
为什么叫做langchain?
在最初阅读入门手册时,我并未完全理解其背后的原因,因为LangChain的官方网站上对此没有明确说明。而是在进一步查阅学习资料的过程中,我发现一些教程,在开篇介绍部分,提供了以下示例代码:- prompt_template = ChatPromptTemplate.from_messages(<br> [<br> ("system", "Translate the following from English into Chinese:"),<br> ("user", "{text}")<br> ]<br>)<br><br>model = ChatOpenAI(model="gpt-3.5-turbo")<br>parser = StrOutputParser()<br><br>chain = prompt_template | model | parser<br>result = chain.invoke({"text":"Welcome to LLM application development!"})<br>print(result)<br>
复制代码 该段落对术语“chain”(链)的命名进行了详细解释,指出其来源于LangChain表达式语言(LangChain Expression Language, 简称LCEL)。这种编程风格借鉴了Linux系统中管道符“|”的概念,通过将多个操作步骤串联起来以实现特定功能。具体到上述示例代码中,流程如下:
- 首先由用户输入信息(自然语言);
- 这些输入被传递给模型进行处理并生成响应;
- 系统解析此响应,并按照预定义格式输出结果。
应用架构图如下:
下面来逐步分析下内部核心。
Prompt
为了使大型语言模型更准确地理解您的需求,可以将提示词按照更加结构化和具体化的格式进行表述。
如果将大模型比作是您的下属或助手,那么您作为“老板”在提出需求时应该遵循一定的框架以确保信息传达的清晰度与准确性。
一个有效的提示词构建方法可以参考以下公式:定义角色+提供背景信息+明确任务目标+指定输出要求。
例如,如果您希望得到一篇关于深圳近期天气情况下的穿衣建议文案,您可以这样构造提示词:“请扮演一位气象分析专家的角色,基于过去十五天深圳市的天气数,撰写一份不少于300字的穿衣指南。该指南应考虑到不同时间段(如早晚温差)以及特定活动(比如户外运动)的需求,并给出相应的着装建议。”
通过这种方式,不仅能够帮助大模型更好地理解和执行您的指令,同时也能提高最终成果的质量与适用性。
提示性工程:通过精心设计提示词(Prompt)来引导大型语言模型(LLM)生成符合预期的响应,其核心目标是通过结构化输入优化模型的输出质量;
比如:- from langchain.chat_models import init_chat_model<br>from langchain.prompts import ChatPromptTemplate<br>model = init_chat_model("gpt-3.5-turbo", model_provider="openai")<br>system_template = "Translate the following from English into {language}"<br>prompt_template = ChatPromptTemplate.from_messages([<br> ("system", system_template),<br> ("user", "{text}"),<br>])<br>prompt = prompt_template.invoke({"language": "Italian", "text": "hi!"})<br>print(prompt.to_messages())<br><br>prompt = prompt_template.invoke({"language": "Chinese", "text": "hi!"})<br>response = model.invoke(prompt)<br>print(response.content)<br>
复制代码 输出如下:- # python .\chat-prompt.py<br>Ciao!<br>喂!<br>
复制代码 常用模板类型
模板类型适用场景示例PromptTemplate简单文本生成(单轮问答)解释{概念},用小学生能理解的语言ChatPromptTemplate多角色对话(如客服系统)组合System/User/Assistant消息FewShotPromptTemplate少样本学习(风格迁移)提供3-5个问答示例引导格式可以在:langchain.prompts 中寻找其他类型;
Model
作为核心,其就是大模型本身,在代码中来声明使用的大模型的来源以及模型名称,但是存在多种引入方式:
直接实例化ChatModel子类- from langchain_openai import ChatOpenAI<br># 配置OpenAI模型<br>gpt_model = ChatOpenAI(<br> model_name="gpt-3.5-turbo", <br> temperature=0.5,<br>)<br><br>
复制代码 统一接口初始化(多模型兼容)- from langchain.chat_models import init_chat_model<br><br># 自动推断厂商(需安装对应SDK)<br>gpt_model = init_chat_model("gpt-4o", temperature=0) # 推断为OpenAI<br>
复制代码 原生SDK调用(高级场景)- <br>from openai import OpenAI<br># 原生OpenAI调用<br>client = OpenAI(api_key=apikey, base_url=base_url)<br>response = client.chat.completions.create(<br> model="gpt-3.5-turbo",<br> messages=[{"role": "user", "content": "你好"}]<br>)<br>
复制代码 优先选择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<br>from langchain_community.tools.tavily_search import TavilySearchResults<br>from langchain_core.messages import HumanMessage<br>from langgraph.prebuilt import create_react_agent<br># 创建模型<br>model = ChatOpenAI(model_name="gpt-3.5-turbo")<br># 创建搜索工具<br>search = TavilySearchResults(max_results=2)<br># 创建工具列表<br>tools = [search]<br># 使用代理<br>config = {"configurable": {"thread_id": "abc123"}}<br># 创建代理<br>agent_executor = create_react_agent(model, tools)<br>for step in agent_executor.stream(<br> {"messages": [HumanMessage(content="hi !明天深圳天气怎么样?")]},<br> config,<br> stream_mode="values",<br>):<br> step["messages"][-1].pretty_print()<br>
复制代码 回答如下:
[code]================================ 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 |