最近在落地企业级AI应用时,很多团队都卡在了从原型到生产的“最后一公里”。模型调用、工具集成、知识检索、流程编排……每个环节都有坑。LangChain作为当前最主流的LLM应用开发框架,其生态下的Agent、RAG、MCP和LangGraph,正是解决这些工程化难题的关键拼图。但官方文档庞杂,社区方案碎片化,新手极易迷失。
本文旨在为你提供一份高度结构化的实战指南,一周时间,系统掌握LangChain 1.3的核心组件与项目级整合方案。我们将从零开始,构建一个具备自主决策(Agent)、私有知识问答(RAG)、外部工具调用(MCP)和复杂流程编排(LangGraph)能力的完整应用。无论你是希望快速上手的开发者,还是寻求最佳实践的架构师,都能从中找到可复用的代码和清晰的架构思路。
1. 背景与核心概念:为什么是LangChain 1.3?
在深入代码之前,我们必须理解这些技术解决了什么问题,以及它们之间的关系。这能帮助你在设计应用时做出正确选择。
1.1 LangChain:LLM应用的“粘合剂”
LangChain不是一个模型,而是一个框架。它的核心价值在于将大型语言模型(LLM)与外部数据源、计算工具、业务流程“链”接起来。想象一下,如果LLM是一个聪明但“与世隔绝”的大脑,LangChain就是为它配备了眼睛(读取文件、数据库)、手(调用API、执行代码)和记忆(存储对话历史、知识库)。
LangChain 1.3版本带来了更稳定的API、性能优化以及对新兴范式(如MCP)的更好支持。它依然是构建复杂LLM应用的基石。
1.2 Agent:赋予LLM“行动力”的智能体
Agent是LangChain中最令人兴奋的概念之一。一个基础的LLM只能进行对话,而一个Agent则可以根据目标,自主决定调用哪些工具(Tools)来完成任务。
- 核心思想:LLM作为“大脑”(决策器),根据用户输入和当前状态,决定下一步是直接回答,还是调用某个工具。工具执行后,结果会返回给大脑进行下一步决策,直到任务完成。
- 典型场景:用户问“今天北京的天气怎么样?然后用中文总结一下”。Agent会先调用天气查询工具,获取数据后,再调用LLM进行总结和翻译。
- 与普通Function Call的区别:普通的LLM Function Call需要开发者预先定义好严格的调用流程。而Agent是动态的、基于LLM推理的,它能处理更开放、多步骤的任务。
1.3 RAG:让LLM拥有“专属知识库”
检索增强生成(Retrieval-Augmented Generation)是解决LLM“幻觉”和知识滞后问题的关键技术。
- 工作原理:
- 索引:将你的私有文档(PDF、Word、数据库)切分、向量化,存入向量数据库(如Chroma, Pinecone)。
- 检索:当用户提问时,将问题向量化,从向量库中找出最相关的文档片段。
- 增强:将这些相关片段作为上下文,与用户问题一起提交给LLM。
- 生成:LLM基于提供的上下文生成准确、可靠的答案。
- 企业价值:基于企业内部的规章制度、产品手册、客服QA构建智能客服、知识库助手,答案有据可查。
1.4 MCP:统一的“工具插座”
模型上下文协议(Model Context Protocol)是LangChain生态中一个相对较新但至关重要的概念。你可以把它理解为工具(Tools)的标准化接口协议。
- 痛点:以前为Agent添加一个新工具(如查数据库、调用内部API),需要针对每个工具写特定的集成代码,过程繁琐。
- MCP的解决之道:MCP定义了一套标准,任何符合该协议的工具都可以被轻松“插入”到支持MCP的客户端(如LangChain)中。工具提供者实现一个MCP Server,客户端通过标准方式发现和调用它。
- 好处:实现了工具与Agent框架的解耦,工具开发者和应用开发者可以独立工作。社区出现了大量现成的MCP Server(如文件读写、SQL查询、网页搜索),直接可用。
1.5 LangGraph:编排复杂AI工作流的“流程图”
当任务不再是简单的单次问答,而是包含分支、循环、状态保持的复杂流程时,就需要LangGraph。
- 定位:LangGraph是建立在LangChain之上的一个库,用于构建有状态的、多智能体(Multi-Agent)工作流。
- 核心概念:用“图”(Graph)来定义工作流。节点(Node)代表一个步骤(如调用LLM、执行工具),边(Edge)代表步骤之间的流转条件。
- 与LangChain Chain的区别:传统的Chain是线性或简单分支的。LangGraph可以轻松实现“循环”——例如,一个审核流程,如果内容不合格,就返回上一步修改,直到审核通过。
- 典型应用:多角色评审系统、游戏NPC对话树、复杂的决策支持系统。
关系总结:LangChain是地基,RAG和MCP是两大核心能力(知识、工具),Agent是利用这些能力的“执行者”,而LangGraph是管理多个执行者完成复杂任务的“导演”。
2. 环境准备与版本说明
我们将使用Python作为开发语言。请确保你的环境满足以下要求。
2.1 基础环境
- 操作系统:macOS / Linux / Windows (WSL2推荐)
- Python版本:>= 3.10 (强烈推荐3.10或3.11,避免最新版本可能存在的兼容性问题)
- 包管理工具:pip 或 conda
- IDE:VS Code (推荐,安装Python扩展) 或 PyCharm
2.2 核心依赖库
创建一个新的项目目录,并建立requirements.txt文件。以下是本教程涉及的核心库及版本建议:
# 核心框架 langchain==0.1.3 langchain-community==0.0.10 # 社区集成工具 langchain-core==0.1.23 # LangChain核心 # 用于编排复杂工作流 langgraph==0.0.52 # 大模型接口 (以OpenAI为例,也可用Ollama本地模型) openai==1.12.0 # 向量数据库与嵌入模型 chromadb==0.4.22 # 轻量级向量数据库 langchain-chroma==0.1.0 # Chroma集成 sentence-transformers==2.2.2 # 本地嵌入模型,可选 # 文档加载与处理 pypdf==3.17.4 # 读取PDF langchain-text-splitters==0.0.1 # 文本分割 tiktoken==0.5.2 # Token计数 # MCP相关 (示例使用) mcp==1.0.0 # MCP客户端库 # 其他工具 python-dotenv==1.0.0 # 管理环境变量使用pip安装:
pip install -r requirements.txt2.3 API密钥配置
在项目根目录创建.env文件,用于安全存储密钥(切勿提交至版本库)。
# .env OPENAI_API_KEY=sk-your-openai-api-key-here # 如需其他服务,如Tavily搜索、SerpAPI等,在此添加 # TAVILY_API_KEY=your-key # SERPAPI_API_KEY=your-key在Python代码中,使用python-dotenv加载:
from dotenv import load_dotenv load_dotenv() import os openai_api_key = os.getenv("OPENAI_API_KEY")3. 核心模块实战:从零构建四大能力
我们将分步构建一个“企业智能研究助手”项目,它能够:1) 回答公司内部知识(RAG);2) 联网搜索最新信息(Agent + Tool);3) 按照固定流程撰写分析报告(LangGraph)。
3.1 第一步:构建私有知识库(RAG)
假设我们有一些公司内部的产品白皮书(PDF格式)。
1. 文档加载与处理
# rag_demo.py from langchain_community.document_loaders import PyPDFLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_chroma import Chroma from langchain_openai import OpenAIEmbeddings import os # 1. 加载文档 loader = PyPDFLoader("./docs/product_whitepaper.pdf") # 替换为你的PDF路径 documents = loader.load() # 2. 分割文本 text_splitter = RecursiveCharacterTextSplitter( chunk_size=1000, # 每个片段大小 chunk_overlap=200, # 重叠部分,避免上下文断裂 length_function=len, is_separator_regex=False, ) splits = text_splitter.split_documents(documents) print(f"将文档切分为 {len(splits)} 个片段") # 3. 向量化并存储 embeddings = OpenAIEmbeddings(model="text-embedding-3-small") # 使用OpenAI嵌入模型 # 也可以使用本地模型:embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2") vectorstore = Chroma.from_documents( documents=splits, embedding=embeddings, persist_directory="./chroma_db" # 向量数据库本地存储路径 ) print("知识库构建完成!")2. 实现检索问答链
# 接上段代码 from langchain.chains import RetrievalQA from langchain_openai import ChatOpenAI # 4. 创建检索器 retriever = vectorstore.as_retriever(search_kwargs={"k": 3}) # 检索最相关的3个片段 # 5. 创建LLM llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0) # 6. 创建RAG链 qa_chain = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", # 将检索到的文档“堆叠”后送入LLM retriever=retriever, return_source_documents=True, # 返回源文档,便于溯源 verbose=True # 显示详细过程 ) # 7. 提问 query = "我们产品的主要优势是什么?" result = qa_chain.invoke({"query": query}) print("答案:", result["result"]) print("\n参考来源:") for doc in result["source_documents"][:2]: # 显示前两个来源 print(f"- {doc.page_content[:200]}...")3.2 第二步:创建能调用工具的智能体(Agent)
我们将创建一个能使用计算器和进行网络搜索的Agent。
1. 定义工具
# agent_demo.py from langchain.agents import Tool, AgentExecutor, create_react_agent from langchain_openai import ChatOpenAI from langchain import hub import math # 自定义工具1:计算器 def calculator(input_str: str) -> str: """执行数学计算。输入是一个数学表达式字符串,如 '3 + 5 * 2'。""" try: # 警告:使用eval有安全风险,仅用于演示。生产环境应使用安全计算库如`ast.literal_eval`或专门库。 result = eval(input_str, {"__builtins__": None}, {"math": math}) return str(result) except Exception as e: return f"计算错误:{e}" # 自定义工具2:模拟搜索(实际项目中替换为Tavily、SerpAPI等真实工具) def search_web(query: str) -> str: """模拟网络搜索。输入是搜索关键词。""" # 此处为模拟,真实情况应调用搜索API mock_results = { "最新AI新闻": "OpenAI发布了新模型GPT-4.5,性能提升20%。", "Python 3.12": "Python 3.12 正式版已发布,主要提升了性能。", "天气": "北京今天晴,气温15-25度。" } return mock_results.get(query, f"未找到关于 '{query}' 的模拟结果。") # 将函数包装成LangChain工具 calc_tool = Tool( name="Calculator", func=calculator, description="用于执行数学计算。输入应是一个清晰的数学表达式,例如 '3 + 5 * 2' 或 'sqrt(16)'。" ) search_tool = Tool( name="Web_Search", func=search_web, description="用于搜索最新的网络信息。输入是搜索查询词。" ) tools = [calc_tool, search_tool]2. 创建Agent并运行
# 接上段代码 # 获取ReAct提示词模板(LangChain Hub预置了优秀的模板) prompt = hub.pull("hwchase17/react") # 初始化LLM llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0) # 创建ReAct Agent agent = create_react_agent(llm, tools, prompt) # 创建执行器 agent_executor = AgentExecutor( agent=agent, tools=tools, verbose=True, # 打印详细思考过程 handle_parsing_errors=True # 优雅处理解析错误 ) # 运行Agent question = "先计算 (15 + 7) * 3 等于多少,然后搜索一下‘最新AI新闻’。" result = agent_executor.invoke({"input": question}) print("\n最终答案:", result["output"])运行上述代码,你会看到Agent的完整思考链(Thought/Action/Observation),最终给出计算结果和搜索信息。
3.3 第三步:集成MCP工具(以文件读取为例)
假设我们想通过MCP协议,让Agent能安全地读取项目目录下的文件。
1. 启动一个MCP Server(模拟)在实际中,你需要运行或实现一个MCP Server。这里我们模拟一个简单的文件读取Server的思路。未来你可以使用mcp库的ClientSession来连接。
# mcp_demo.py (概念性代码,展示集成思路) # 注意:目前LangChain对MCP的完全集成尚在演进中,以下展示未来标准集成模式。 # 假设我们已经有一个运行在某个端口的MCP Server(例如官方示例的`filesystem` server) # 我们可以通过配置让LangChain Agent将其作为工具使用。 from langchain.agents import Tool # 未来可能会有类似 LangChainMCPClient 的封装 # from langchain_mcp import LangChainMCPClient # 1. 连接到MCP Server # mcp_client = LangChainMCPClient(server_url="http://localhost:8000") # 2. 发现Server提供的工具(自动发现) # discovered_tools = mcp_client.discover_tools() # 3. 将这些工具添加到Agent的工具列表中 # tools_from_mcp = [Tool.from_mcp_tool(tool) for tool in discovered_tools] # 4. 与之前自定义的tools合并 # all_tools = tools + tools_from_mcp # 然后使用 all_tools 创建Agent... print("MCP的核心价值在于工具的动态发现和标准化集成。当前,你可以手动将MCP Server提供的功能包装成标准的LangChain Tool来使用。")当前实践建议:对于已有的MCP Server(如Tavily搜索、Brave搜索的MCP适配),你可以查看其文档,通常它们会提供如何将其功能封装为Python函数,然后你就可以像3.2节一样,将其包装成Tool供Agent使用。
3.4 第四步:用LangGraph编排报告生成工作流
我们将创建一个简单的“报告生成器”工作流,包含:1) 收集信息;2) 撰写草稿;3) 审核;4) 若审核不通过则修改。
# langgraph_demo.py from typing import TypedDict, Annotated, List from langgraph.graph import StateGraph, END from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage, SystemMessage import operator # 1. 定义状态结构 class ReportState(TypedDict): topic: str # 报告主题 collected_info: List[str] # 收集到的信息 draft: str # 报告草稿 review_comments: str # 审核意见 is_approved: bool # 是否通过审核 final_report: str # 最终报告 # 2. 定义节点函数 def collect_info(state: ReportState): """节点:收集信息(这里模拟从RAG或搜索获取)""" print(f"[节点:收集信息] 主题: {state['topic']}") # 模拟收集过程 mock_info = [ f"关于{state['topic']}的第一条关键信息。", f"关于{state['topic']}的统计数据:增长30%。", f"行业对{state['topic']}的普遍看法是积极的。" ] return {"collected_info": mock_info} def write_draft(state: ReportState): """节点:根据收集的信息撰写草稿""" print(f"[节点:撰写草稿] 使用信息: {state['collected_info']}") llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.7) info_text = "\n".join(state["collected_info"]) prompt = f"基于以下信息,撰写一份关于'{state['topic']}'的简短报告草稿:\n{info_text}" messages = [HumanMessage(content=prompt)] response = llm.invoke(messages) return {"draft": response.content} def review_draft(state: ReportState): """节点:审核草稿""" print(f"[节点:审核草稿] 审核中...") llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0) prompt = f"请以严格审核员的身份,审核以下报告草稿,只指出是否通过及主要问题。草稿:\n{state['draft']}\n\n回复格式:通过/不通过 - 原因" messages = [SystemMessage(content="你是一个严格的审核员。"), HumanMessage(content=prompt)] response = llm.invoke(messages) review_text = response.content is_approved = "通过" in review_text.split("-")[0] return {"review_comments": review_text, "is_approved": is_approved} def revise_draft(state: ReportState): """节点:根据审核意见修改草稿""" print(f"[节点:修改草稿] 根据意见修改: {state['review_comments']}") llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.7) prompt = f"报告草稿:{state['draft']}\n\n审核意见:{state['review_comments']}\n\n请根据审核意见修改并完善报告草稿。" messages = [HumanMessage(content=prompt)] response = llm.invoke(messages) return {"draft": response.content, "review_comments": "", "is_approved": True} # 修改后默认通过 def finalize_report(state: ReportState): """节点:定稿""" print("[节点:定稿] 生成最终报告") return {"final_report": state["draft"]} # 3. 构建图 workflow = StateGraph(ReportState) # 添加节点 workflow.add_node("collect", collect_info) workflow.add_node("write", write_draft) workflow.add_node("review", review_draft) workflow.add_node("revise", revise_draft) workflow.add_node("finalize", finalize_report) # 设置边(流程) workflow.set_entry_point("collect") workflow.add_edge("collect", "write") workflow.add_edge("write", "review") # 条件边:根据审核结果决定下一步 def decide_after_review(state: ReportState): if state["is_approved"]: return "finalize" else: return "revise" workflow.add_conditional_edges( "review", decide_after_review, { "finalize": "finalize", "revise": "revise", } ) workflow.add_edge("revise", "review") # 修改后返回审核节点 workflow.add_edge("finalize", END) # 编译图 app = workflow.compile() # 4. 运行工作流 initial_state = {"topic": "大语言模型在企业中的应用前景"} final_state = app.invoke(initial_state) print("\n" + "="*50) print("工作流执行完成!") print(f"最终报告:\n{final_state['final_report']}")这个例子展示了LangGraph如何管理带有循环(修改-再审)的复杂状态流程。
4. 项目整合:构建企业智能研究助手
现在,我们将前面四个模块整合到一个项目中。项目结构如下:
smart_research_assistant/ ├── .env ├── requirements.txt ├── docs/ │ └── product_whitepaper.pdf ├── chroma_db/ (向量数据库存储,由代码生成) ├── core/ │ ├── __init__.py │ ├── knowledge_base.py # RAG知识库模块 │ ├── tools.py # 自定义及MCP工具定义 │ └── workflow.py # LangGraph工作流定义 ├── agents/ │ └── research_agent.py # 主Agent逻辑 └── main.py # 应用入口核心整合逻辑 (agents/research_agent.py):
# agents/research_agent.py from langchain.agents import AgentExecutor, create_react_agent from langchain_openai import ChatOpenAI from langchain import hub from core.knowledge_base import get_rag_tool # 假设我们将RAG也封装成了工具 from core.tools import calculator, search_tool # 导入自定义工具 from core.workflow import report_workflow_app # 导入定义好的LangGraph应用 class ResearchAssistant: def __init__(self): self.llm = ChatOpenAI(model="gpt-4-turbo-preview", temperature=0) # 使用更强模型 # 1. 集成工具 rag_tool = get_rag_tool() # 返回一个Tool,其功能是查询内部知识库 self.tools = [rag_tool, search_tool] # 组合工具列表 # 2. 创建Agent prompt = hub.pull("hwchase17/react") agent = create_react_agent(self.llm, self.tools, prompt) self.agent_executor = AgentExecutor( agent=agent, tools=self.tools, verbose=True, handle_parsing_errors=True ) # 3. 持有工作流应用 self.workflow_app = report_workflow_app def chat(self, query: str): """处理简单问答和工具调用""" if "写报告" in query or "生成分析" in query: # 触发复杂工作流 topic = query.replace("写一份关于", "").replace("的报告", "").strip() state = self.workflow_app.invoke({"topic": topic}) return state["final_report"] else: # 使用Agent处理 result = self.agent_executor.invoke({"input": query}) return result["output"] # main.py from agents.research_agent import ResearchAssistant def main(): assistant = ResearchAssistant() print("智能研究助手已启动。输入'退出'结束。") while True: user_input = input("\n您的问题:") if user_input.lower() in ["退出", "exit", "quit"]: break response = assistant.chat(user_input) print(f"\n助手:{response}") if __name__ == "__main__": main()5. 常见问题与排查思路
在开发过程中,你几乎一定会遇到以下问题。
| 问题现象 | 可能原因 | 排查与解决思路 |
|---|---|---|
ModuleNotFoundError: No module named 'langchain_community' | 依赖未正确安装或版本冲突。 | 1. 检查requirements.txt是否正确。2. 尝试pip install --upgrade langchain-community。3. 创建全新的虚拟环境重新安装。 |
| Agent陷入循环,不停调用工具 | 提示词引导不佳,或工具描述不清晰,导致LLM无法做出正确决策。 | 1. 检查工具的描述(description),确保其清晰、无歧义。2. 使用更强大的LLM(如GPT-4)。3. 在AgentExecutor中设置max_iterations(最大迭代次数)和early_stopping_method。 |
| RAG返回的答案与文档无关(幻觉) | 检索到的文档片段不相关,或LLM忽略了上下文。 | 1. 调整检索器参数search_kwargs={"k": 5}或尝试不同的search_type(如mmr)。2. 检查文本分割参数(chunk_size,chunk_overlap),可能片段太大或太小。3. 在提示词中强调“仅根据上下文回答”。 |
| LangGraph工作流状态不更新 | 节点函数返回值与状态(State)的键不匹配,或未使用Annotated正确声明。 | 1. 确保节点函数返回的字典键名与TypedDict中定义的完全一致。2. 对于列表等可变结构的更新,使用operator.add或自定义归并函数。3. 使用app.get_graph().draw_mermaid()(需安装ipykernel)可视化检查图结构。 |
| 调用OpenAI API超时或报错 | 网络问题、API密钥错误、额度不足、或请求速率超限。 | 1. 检查.env文件中的OPENAI_API_KEY。2. 检查网络连接。3. 登录OpenAI平台查看额度与用量。4. 在代码中增加重试逻辑和超时设置。 |
| ChromaDB 报权限或锁错误 | 多进程同时读写同一个持久化目录。 | 1. 确保应用是单进程运行,或为每个进程/线程指定不同的persist_directory。2. 使用客户端-服务器模式的Chroma。3. 考虑使用其他向量库如FAISS(纯内存)或Qdrant(云服务)。 |
6. 最佳实践与工程建议
将原型转化为可维护、高性能的生产级应用,需要遵循以下准则。
6.1 架构设计
- 解耦与分层:严格区分数据层(向量库)、工具层(MCP/Tools)、智能层(Agent/Chain)、编排层(LangGraph)和表现层(Web/API)。这有利于独立测试和升级。
- 状态管理:对于复杂应用,使用LangGraph的State进行集中、显式的状态管理。避免在全局变量或链之间隐式传递数据。
- 工具设计:工具函数应保持单一职责、幂等性(相同输入产生相同输出)和安全性。对用户输入进行严格的验证和清理,特别是涉及文件操作、系统命令或数据库查询时。
6.2 性能优化
- 缓存:对LLM调用、嵌入计算和工具查询结果进行缓存。LangChain内置了
InMemoryCache、SQLiteCache等,也可集成Redis。 - 异步:对于I/O密集型操作(如调用多个独立API),使用LangChain的异步接口(
ainvoke,abatch)提升吞吐量。 - 批处理:文档嵌入(Embedding)时,尽量批量处理,减少API调用次数。
- 模型选择:任务匹配模型。简单的分类、提取任务可用小模型(如
gpt-3.5-turbo),复杂推理、创作任务再用大模型(如GPT-4)。嵌入模型也可选用更快的本地模型(如all-MiniLM-L6-v2)。
6.3 可观察性与监控
- 日志记录:为Agent的思考过程、工具调用、RAG的检索结果、工作流状态转换等关键步骤添加结构化日志。使用
verbose=True只是开始,生产环境需要接入ELK或类似系统。 - 链路追踪:使用LangSmith(LangChain官方平台)或OpenTelemetry来追踪每次调用的耗时、输入输出、中间步骤,这是调试复杂链和Agent的利器。
- 指标监控:监控Token消耗、API延迟、错误率、工具调用成功率等业务指标。
6.4 安全与合规
- 输入净化:对所有用户输入进行过滤,防止Prompt注入攻击。避免将未经处理的用户输入直接拼接为提示词或工具参数。
- 输出审查:对LLM生成的内容进行后处理审查,过滤不当内容。
- 权限控制:在工具层面实现权限控制。例如,文件读取工具只能访问特定目录;数据库工具只能执行查询,不能执行删除。
- 数据隐私:使用本地嵌入模型和向量数据库可以避免数据上传至云端。如果使用云端LLM,需评估数据出境风险,并考虑对敏感数据进行脱敏处理。
6.5 提示词工程
- 模板化:将提示词存储在外部文件或数据库中,便于管理和A/B测试。
- 少样本学习:在提示词中提供少量高质量示例(Few-shot),能显著提升复杂任务的执行效果。
- 结构化输出:要求LLM以JSON、XML等特定格式输出,便于后续程序化处理。LangChain的
PydanticOutputParser是很好的工具。
一周的时间,通过这样一个从模块到整合的项目实战,你不仅理解了LangChain 1.3中Agent、RAG、MCP、LangGraph的核心概念,更掌握了将它们组合起来解决真实问题的能力。真正的精通源于实践和迭代,建议你以此项目为起点,尝试替换不同的工具(如使用真实的搜索API)、接入更复杂的MCP Server、或者设计一个包含多个协同Agent的LangGraph工作流。在踩坑和解决问题的过程中,你对大模型应用开发的理解会愈发深刻。