资讯动态

基于RAG与GLM大模型的计算机考研408智能问答系统构建实战

发布时间:2026/8/28 9:09:42 来源:尧图企业网站定制
简介检索增强生成RAG技术通过结合外部知识库与大语言模型有效解决了模型的知识幻觉与信息过时问题提升了问答系统的准确性与可信度。其核心原理是将文档向量化存储并在回答时进行语义检索确保生成内容有据可依。在工程实践中该技术特别适用于知识体系明确、答案要求严谨的垂直领域如教育、客服与专业咨询。本文以计算机考研408科目为例详细阐述了如何利用智谱清言GLM大模型与Chroma向量数据库从知识库构建、语义检索到提示工程一步步实现一个能精准解答专业问题的智能助手为开发者提供了RAG技术落地的完整范例与调优经验。1. 项目概述与核心价值最近在折腾一个挺有意思的东西一个专门给计算机考研408统考科目用的智能问答系统。起因很简单身边几个学弟学妹在备考天天被数据结构、操作系统、计算机组成原理、计算机网络这四座大山折磨得够呛。他们最常抱怨的就是知识点太散题目一综合就懵网上搜答案要么不精准要么解释得云里雾里。市面上通用的AI助手比如直接问ChatGPT对于408这种有固定考纲、答案要求严谨的领域经常会出现“一本正经地胡说八道”的情况或者给出的解答过于宽泛不够“应试”。所以我就想能不能用现在比较火的RAG检索增强生成技术结合一个靠谱的大模型做一个垂直领域的“学霸助手”核心思路就是把海量的、高质量的408考研资料教材、真题、权威讲义、笔记先“喂”给系统让它建立起一个专属的知识库。当用户提问时系统不是让大模型凭空想象而是先从这个知识库里去精准地找到最相关的资料片段然后结合这些“证据”来生成答案。这样既能保证答案的专业性和准确性又能针对具体问题给出紧扣考点的解答。我选择了智谱清言的GLM大模型作为生成引擎主要是看中它在中文理解和推理上的稳定表现以及API调用的便捷性。整个系统的骨架就是“RAG检索增强生成”前端接收问题后端通过语义检索从向量数据库中捞取相关文档拼接到提示词里再调用GLM API生成最终答案。这听起来可能有点技术化但说白了就是给大模型配了一个“超级参考书库”和一位“精准的图书管理员”确保它每次答题都有据可依。这个项目非常适合有一定Python基础对AI应用开发感兴趣的朋友特别是想深入理解RAG技术如何落地到具体场景的同学。它不只是一个玩具而是一个能真实解决痛点的工具原型。接下来我会把从零搭建这个系统的完整过程、踩过的坑、以及如何让它真正“好用”的经验毫无保留地分享出来。2. 系统整体架构与核心组件选型2.1 为什么选择RAG架构在决定做这个系统时我首先排除了两种方案一是直接用大模型做“裸奔”问答二是训练一个专门的微调模型。前者准确率无法保证后者则成本高昂且不灵活。RAG成了最理想的折中方案。RAG的核心优势在于“开卷考试”。对于408考研这种知识体系庞大但边界相对清晰、答案有标准参考的领域让模型拥有一个实时、可更新的“外部记忆”至关重要。它解决了大模型的几个固有难题知识幻觉模型可能会编造不存在的概念或定理。RAG通过提供检索到的真实文本来约束生成。知识过时大模型的训练数据有截止日期而考研大纲和热点每年可能有微调。RAG的知识库可以随时更新。长尾细节遗忘模型可能记不住某些冷门但重要的知识点比如某个特定年份真题的某个选项解析。RAG可以精准检索出这些细节。我的系统架构遵循经典的RAG流水线主要包括四个核心环节文档处理与向量化 - 向量存储与检索 - 提示工程与答案合成 - 前端交互。2.2 核心组件深度解析2.2.1 大模型API为什么是智谱清言GLM在众多国产大模型API中我最终选择了智谱清言主要基于以下几点实战考量中文优化与逻辑推理能力GLM系列模型在中文文本处理、逻辑推理和代码生成方面表现均衡且稳定。对于408的题目尤其是涉及算法步骤、系统流程描述时需要模型有清晰的逻辑链条GLM在这方面满足要求。API稳定与成本可控智谱的API平台文档清晰提供了多种规格的模型如GLM-4、GLM-3-Turbo并且有明确的计费方式。对于个人项目或小规模应用其免费额度和性价比是重要的考虑因素。相比一些开源模型自建服务的运维复杂度使用成熟的API能让我更专注于应用逻辑本身。上下文长度与函数调用GLM-4等模型支持足够长的上下文如128K这对于RAG至关重要因为我们需要将检索到的多个文档片段可能很长连同问题一起送入模型。虽然本项目暂未用到但其函数调用能力也为未来扩展如连接计算器、画图工具留下了空间。注意API调用中的常见坑。在开发过程中我频繁遇到几种API错误这里提前预警api error: 400 the thinking_budget parameter must be a positive integer and...这是调用GLM-4等具备“思考”功能模型时可能出现的错误。thinking_budget参数控制模型的思考深度必须设置为正整数。如果不需要深度思考可以将其设为0或一个较小的值如128。在代码中务必检查这个参数的类型和值。api error: 400 this models maximum context length is...这是最常遇到的错误之一当你的提示词系统指令用户问题检索到的文档总长度超过了模型的最大上下文限制就会报此错。解决方案1. 在检索后对返回的文档片段进行长度裁剪或智能摘要2. 选择上下文更长的模型版本3. 优化提示词减少冗余。api error: 402 insufficient balance账户余额不足。智谱API需要充值记得在平台查看用量和余额。transport failure for /api/...: http 403通常是API Key错误、没有权限或请求频率超限。检查API Key是否正确以及是否有调用该接口的权限。2.2.2 向量数据库Chroma的轻量之选向量数据库是RAG的“记忆中枢”负责存储文档的向量嵌入Embedding并实现高速的相似性检索。我选择了ChromaDB一个开源且易用的向量数据库。选型理由简单易用Python原生Chroma的API设计非常Pythonic几行代码就能完成客户端初始化、集合创建、数据插入和查询非常适合快速原型开发。内存/持久化模式灵活开发阶段可以用persist_directory参数将数据持久化到磁盘避免每次重启都要重新构建向量库。生产环境也可以部署为独立的服务。与流行Embedding模型集成好它天然支持OpenAI、Sentence-Transformers等主流嵌入模型切换起来很方便。与Milvus、Pinecone等的对比Milvus功能更强大适合超大规模向量检索但部署和运维相对复杂。Pinecone是完全托管的云服务省心但可能有成本。对于我这个“408知识库”项目数据量在十万级文档块以内Chroma在性能和易用性上取得了最佳平衡。网上搜索“windows安装向量数据库milvus standalone安装”也侧面说明Milvus的安装对新手有一定门槛。实操心得数据持久化。一定要在创建Chroma客户端时指定persist_directory例如Chroma(persist_directory./chroma_db, embedding_functionembedding_function)。这样当你添加新文档后调用collection.persist()方法数据才会真正保存到磁盘。我一开始没注意结果每次脚本跑完数据就丢了排查了好久。2.2.3 嵌入模型文本转化为向量的关键嵌入模型负责将文本转换为计算机可以理解的数值向量一组高维数字。检索的本质就是计算问题向量与知识库中所有文档向量之间的“距离”通常用余弦相似度找到最“近”的几段。我选用的模型text-embedding-ada-002或Sentence-Transformers库中的paraphrase-multilingual-MiniLM-L12-v2。初期/快速验证可以使用OpenAI的嵌入模型效果稳定但需付费且有速率限制。本地化/免费方案强烈推荐Sentence-Transformers。它提供了大量高质量的开源嵌入模型特别是paraphrase-multilingual-MiniLM-L12-v2这个模型对多语言包括中文支持很好且完全免费可以离线运行。这对于处理中文为主的408资料至关重要。嵌入维度不同的模型产出不同维度的向量如384维、768维、1536维。这会影响向量数据库的存储和检索效率但通常不需要我们深究只需确保构建索引和查询时使用同一个模型即可。3. 知识库构建从原始资料到向量数据库这是整个系统最耗时但也最奠定基础的一步。质量不高的知识库会导致后续检索垃圾进、垃圾出。3.1 资料收集与预处理我的资料主要来源于王道、天勤等权威辅导书的电子版合法获取、历年408统考真题与解析PDF、各大高校的精品课程PPT、以及我自己整理的高频考点笔记。预处理流程如下格式统一使用pdfplumber或PyMuPDF解析PDF使用python-docx处理Word将所有资料转换为纯文本。这一步会遇到格式混乱、分栏文本错序等问题。避坑技巧对于扫描版PDF需要先用OCR工具如Tesseract或调用百度/腾讯的OCR API进行文字识别。对于解析后文本顺序错乱的问题可以尝试不同的PDF解析库或者根据坐标信息对文本块进行排序。文本清洗去除无关的页眉、页脚、水印、网址。将全角字符转换为半角如逗号、括号。规范化换行符将多个连续空白字符替换为单个空格。可选使用正则表达式移除特定的广告或无关信息。文本分割Chunking这是至关重要的一步直接决定检索精度。不能简单按固定字符数切割那样会割裂完整的知识点。策略采用递归分割法。优先按自然段落\n\n分割。如果某个段落过长如超过500字再按句子分割符。等进行二次分割。同时要保证每个块有适当的大小我设定在200-500字之间太小则信息不完整太大则检索会引入噪声。重叠在块与块之间设置一个小的重叠区如50字。这能确保当一个知识点恰好被分割在两个块的边界时检索时仍有较大概率被覆盖到避免信息丢失。元数据附加为每个文本块附加元数据方便后续追溯和筛选。我附加的元数据包括source来源文件名、chapter章节名如果解析得出、page页码如果解析得出、type题型如“概念”、“真题”、“解析”。3.2 向量化与入库预处理后我们得到了一系列干净的文本块列表。接下来就是将它们转化为向量并存入ChromaDB。# 示例代码使用Sentence-Transformers构建向量库 from sentence_transformers import SentenceTransformer import chromadb from chromadb.config import Settings # 1. 加载嵌入模型 embed_model SentenceTransformer(paraphrase-multilingual-MiniLM-L12-v2) # 2. 初始化Chroma客户端并指定持久化目录 chroma_client chromadb.PersistentClient(path./chroma_408_db) # 3. 创建或获取一个集合collection类似于数据库的表 collection chroma_client.get_or_create_collection( name408_knowledge_base, metadata{description: 计算机考研408知识向量库} ) # 假设我们已经有了清洗和分割好的文本块列表 text_chunks 和对应的元数据列表 metadatas texts [chunk[text] for chunk in text_chunks] metadatas [chunk[metadata] for chunk in text_chunks] ids [fchunk_{i} for i in range(len(texts))] # 为每个块生成唯一ID # 4. 生成嵌入向量 # 注意Chroma可以在add时自动调用嵌入函数但为了演示清晰这里先批量生成。 # 在实际大批量处理时建议使用Chroma的自动嵌入功能避免内存溢出。 embeddings embed_model.encode(texts, show_progress_barTrue) # 5. 将数据添加到集合 collection.add( embeddingsembeddings.tolist(), # 转换为list documentstexts, metadatasmetadatas, idsids ) print(f成功入库 {len(texts)} 个文本块。)关键参数与操作意图path./chroma_408_db指定数据库本地存储路径。之后重启程序只需用同样的路径初始化客户端就能加载已有数据。collection.add这是核心操作。我们一次性传入了embeddings向量、documents原始文本、metadatas元数据、idsID。Chroma会建立索引支持快速检索。批量处理与内存如果资料库非常大几十万个块一次性生成所有向量并add可能会导致内存不足。需要实现分批处理读取一批文本 - 生成嵌入 - 入库 - 清空内存循环进行。4. 智能问答链路的实现细节知识库准备好后就进入了系统的核心逻辑问答链路。当用户提出一个问题系统如何运作4.1 检索器如何找到最相关的资料检索不是简单的关键词匹配而是语义搜索。我们计算用户问题的向量然后在向量数据库中寻找最相似的文本块向量。def retrieve_relevant_docs(query, collection, embed_model, top_k5): 检索与问题最相关的文档。 :param query: 用户问题 :param collection: ChromaDB集合对象 :param embed_model: 嵌入模型 :param top_k: 返回最相关的K个结果 :return: 相关文档的列表 # 1. 将用户问题转化为向量 query_embedding embed_model.encode([query]).tolist()[0] # 2. 查询向量数据库 results collection.query( query_embeddings[query_embedding], n_resultstop_k, include[documents, metadatas, distances] # 指定返回的内容 ) # 3. 整理结果 relevant_docs [] if results[documents]: for i, doc in enumerate(results[documents][0]): relevant_docs.append({ content: doc, metadata: results[metadatas][0][i], score: 1 - results[distances][0][i] # 将距离转换为相似度分数假设使用余弦相似度 }) return relevant_docs检索优化技巧Top-K与分数阈值top_k不宜过大通常3-7个足够。可以设置一个相似度分数阈值如0.7低于此阈值的文档认为不相关不传递给大模型避免引入干扰信息。元数据过滤Chroma支持在查询时进行元数据过滤。例如如果用户明确问“关于2019年408真题第33题”我们可以在查询中加入where{type: 真题解析}来缩小范围提升精度和速度。混合检索除了语义检索也可以结合关键词检索如BM25。例如先用关键词快速筛选出一批候选文档再对这批文档进行语义相似度排序。这能更好地处理一些包含特定术语、缩写的问题。4.2 提示工程如何让大模型“好好说话”检索到的文档只是原材料如何组织成提示词Prompt交给大模型决定了答案的质量。这是RAG系统的“灵魂”。我的提示词模板经过多次迭代最终形成了一个比较稳定的结构你是一个专业的计算机考研408科目辅导专家。请严格根据以下提供的相关参考资料来回答问题。如果资料中没有明确答案请如实告知“根据现有资料无法回答”不要编造信息。 用户问题{user_question} 相关参考资料 {formatted_context} 请基于以上资料用清晰、准确、专业的中文回答用户的问题。答案应紧扣408考纲逻辑严谨。如果是概念题请先给出定义再解释如果是计算或算法题请分步骤解答。关键设计点角色设定明确告诉模型“你是什么”引导其输出风格。指令清晰“严格根据以下提供的相关参考资料”是核心指令强制模型以检索到的内容为基准抑制幻觉。格式化上下文{formatted_context}需要将检索到的多个文档块清晰、无重复地组织起来。我通常用分隔符---隔开每个块并在开头注明来源例如[来源《操作系统概念》第7章 页码205] 进程是正在执行的程序实例。它包括程序代码、当前活动通过程序计数器和寄存器的内容表示以及相关资源... --- [来源2018年408真题解析] 题目下列关于进程和线程的描述中错误的是... 解析线程是CPU调度的基本单位进程是资源分配的基本单位...这样有助于模型区分不同来源的信息并在答案中需要时进行引用虽然当前提示词未要求引用但结构清晰有利于模型理解。安全兜底“如果资料中没有明确答案请如实告知...” 这句话非常重要是防止模型胡编乱造的最后一道防线。输出格式引导最后一句对答案格式做了引导使答案更符合“应试辅导”的预期。4.3 生成与后处理调用API与答案优化有了精心构造的提示词就可以调用智谱清言的API了。import zhipuai # 需要先安装zhipuai库并配置API Key from zhipuai import ZhipuAI def generate_answer_with_glm(prompt, modelglm-4): 调用智谱GLM API生成答案。 client ZhipuAI(api_keyyour_api_key_here) # 替换为你的API Key try: response client.chat.completions.create( modelmodel, messages[ {role: user, content: prompt} ], temperature0.1, # 温度设低保证答案确定性高 top_p0.7, # 如果使用GLM-4且需要思考链可以设置 thinking_budget例如 # thinking_budget512, max_tokens2000 # 根据答案长度预期设置 ) return response.choices[0].message.content except Exception as e: # 这里需要处理前面提到的各种API错误 if maximum context length in str(e): return 错误输入内容过长请尝试简化您的问题。 elif thinking_budget in str(e): return 错误思考预算参数设置不正确。 elif insufficient balance in str(e): return 错误API余额不足。 else: return f调用模型API时发生错误{e}参数调优心得temperature强烈建议设置为0.1-0.3之间。对于知识问答我们需要的是准确、确定的答案而不是创造性。低温度值能减少模型“瞎编”的概率。max_tokens根据你的提示词长度和预期答案长度来设置。408的答案通常不会特别长2000一般足够。设置太小会导致答案被截断。错误处理必须对API调用进行完善的异常捕获和用户友好的错误提示。将技术性错误如上下文过长、余额不足转化为用户能理解的信息。后处理生成的答案有时会包含一些多余的礼貌用语或格式标记。可以写一个简单的后处理函数去除答案开头结尾的“根据资料...”、“综上所述...”等套话让答案更精炼。但要注意不要破坏答案的核心内容。5. 系统集成与前端交互后端逻辑完成后需要提供一个界面给用户使用。为了快速验证我选择了用Gradio构建一个简单的Web界面。Gradio非常适合机器学习项目的演示几行代码就能生成一个交互式UI。import gradio as gr from retrieval import retrieve_relevant_docs # 假设检索函数在此模块 from generation import generate_answer_with_glm # 假设生成函数在此模块 from embedding import get_embed_model_and_collection # 假设加载模型和数据库的函数 # 初始化组件在实际应用中应考虑单例模式避免重复加载 embed_model, collection get_embed_model_and_collection() def answer_question(question, history): Gradio聊天接口的回调函数。 # 1. 检索 relevant_docs retrieve_relevant_docs(question, collection, embed_model, top_k4) if not relevant_docs: return 未在知识库中找到相关信息。请尝试换一种问法或确认问题是否在408考纲内。 # 2. 构建上下文 context_parts [] for doc in relevant_docs: source_info doc[metadata].get(source, 未知来源) context_parts.append(f[来源{source_info}]\n{doc[content]}) formatted_context \n---\n.join(context_parts) # 3. 构建提示词 prompt f你是一个专业的计算机考研408科目辅导专家。请严格根据以下提供的相关参考资料来回答问题。如果资料中没有明确答案请如实告知“根据现有资料无法回答”不要编造信息。 用户问题{question} 相关参考资料 {formatted_context} 请基于以上资料用清晰、准确、专业的中文回答用户的问题。答案应紧扣408考纲逻辑严谨。 # 4. 生成 answer generate_answer_with_glm(prompt) # 5. 返回Gradio ChatInterface期望返回 (question, answer) 对 return answer # 构建Gradio界面 demo gr.ChatInterface( fnanswer_question, title408考研智能问答助手, description请输入关于计算机专业考研408科目数据结构、操作系统、计算机组成原理、计算机网络的问题。, examples[什么是虚拟内存, 简述TCP三次握手的过程。, 2019年408真题第33题的答案是什么], cache_examplesFalse # 对于实时检索不建议缓存例子 ) if __name__ __main__: demo.launch(shareFalse, server_name0.0.0.0, server_port7860)这个界面提供了一个聊天框用户可以直接提问。examples参数提供了一些示例问题方便用户快速了解系统能力。启动后在浏览器打开http://localhost:7860即可使用。部署考虑对于个人使用或小范围分享Gradio的launch(shareTrue)可以生成一个临时公网链接。如需长期服务可以考虑将后端封装为FastAPI接口前端用更成熟的框架如Vue/React重写并部署到云服务器。6. 效果评估、迭代与常见问题排查系统跑起来只是第一步更重要的是让它“跑得好”。我设计了一套评估和迭代的方法。6.1 如何评估问答效果不能只靠感觉需要有一些可量化的评估方式人工评测黄金标准构建一个测试集包含50-100个覆盖不同知识点和题型的问题并准备好标准答案或参考答案。让系统回答然后从以下几个维度人工评分1-5分相关性答案是否直接针对问题准确性答案中的事实、概念、数据是否正确完整性是否涵盖了问题的所有要点清晰度表述是否清晰易懂逻辑是否通顺检索质量评估在人工评测时同时观察系统检索到的文档。评估检索到的文档是否真的与问题相关是否是回答问题的关键依据。“幻觉”率统计记录系统在测试集中“编造”信息即答案中的关键点无法在提供的参考资料中找到依据的次数。6.2 迭代优化方向根据评估结果可以从以下几个环节进行优化知识库层面扩充资料增加缺失知识点的资料。优化分割如果发现检索到的文档总是首尾不全调整分割策略如增大块大小或重叠区。清洗增强对质量不高的原始文本如OCR错误多的进行二次校对和清洗。检索层面调整检索数量top_k值。尝试重排序在初步检索出Top N个文档后使用一个更精细的模型如交叉编码器对它们进行重排序将最相关的一两个放在前面提升上下文质量。引入元数据过滤让用户在前端可以选择问题类型概念、真题、计算后端根据类型过滤提升精度。提示工程层面迭代提示词这是成本最低的优化方式。尝试不同的角色设定、指令措辞、上下文格式观察对答案质量的影响。例如加入“请分点论述”、“请对比两者的区别”等具体指令。少样本提示在提示词中提供一两个高质量的问答示例引导模型模仿格式和风格。6.3 常见问题与排查清单在实际开发和测试中我遇到了不少问题这里总结一个排查清单问题现象可能原因解决方案答案完全胡编乱造与资料无关1. 检索失败返回空或完全不相关的文档。2. 提示词未强制要求“根据资料”。3. 模型温度(temperature)设置过高。1. 检查检索函数打印出检索到的文档内容看是否相关。检查嵌入模型是否匹配。2. 强化提示词中的指令如“必须严格依据以下资料”。3. 将temperature降至0.2以下。答案部分正确部分“幻觉”1. 检索到的资料不完整或包含错误信息。2. 上下文过长模型未能有效关注全部关键信息。3. 不同资料片段之间存在矛盾模型混淆。1. 优化知识库质量清理错误资料。2. 减少top_k或对检索到的文档进行摘要浓缩后再输入。3. 在提示词中要求模型“如果资料间有冲突以[某权威来源]为准”。答案总是说“资料中未找到”1. 检索阈值设置过高相关文档被过滤。2. 知识库确实缺乏该问题对应的资料。3. 用户问题表述与资料表述差异太大语义鸿沟。1. 降低相似度分数阈值或增加top_k。2. 扩充知识库。3. 尝试对用户问题进行查询扩展如提取关键词的同义词、相关术语一并搜索。响应速度很慢1. 向量数据库检索慢数据量大时。2. 大模型API调用网络延迟高。3. 嵌入模型在CPU上运行慢。1. 为ChromaDB创建索引如果支持或考虑升级硬件/使用云服务。2. 检查网络或考虑使用API的流式响应以提升感知速度。3. 如果有GPU将Sentence-Transformers模型加载到GPU上。遇到api error: 400 maximum context length提示词系统指令用户问题检索文档总长度超过模型限制。1. 减少top_k减少输入文档数量。2. 对检索到的文档进行摘要或截断如只取前N个字符。3. 换用上下文更长的模型。一个高级技巧查询理解与重写。用户的问题可能很口语化如“学不动了页表是干啥的”而知识库中的文档是书面语。可以在检索前先用大模型对用户问题进行一轮“重写”将其改写成更规范、更利于检索的学术性问题如“请解释页表的概念及其在虚拟内存管理中的作用”再将重写后的问题用于向量检索能显著提升检索命中率。这相当于增加了一个“问题理解”的预处理层。7. 项目总结与未来展望构建这个系统的过程是一个典型的将前沿AI技术RAG大模型应用于垂直领域解决实际问题的工程实践。它不是一个炫技的demo而是一个真正能产生价值的工具。通过它我深刻体会到在AI应用开发中数据和流程的工程优化其重要性往往不亚于模型本身。一个精心构建的知识库和一条设计合理的RAG流水线比单纯追求更庞大的模型更能带来质的提升。这个系统目前已经能相当可靠地回答大多数408的概念性、原理性和真题解析类问题。但它还有很大的进化空间多模态扩展408中有很多图比如数据结构中的树、图组成原理中的CPU流水线。未来可以考虑接入多模态大模型支持用户上传图表提问或者让系统在答案中生成示意图。复杂推理与解题对于复杂的算法设计题或综合应用题当前系统可能只能提供思路或知识点提示。可以探索更复杂的Agent框架让模型能够调用代码执行器进行模拟计算或者进行多步骤的推理链Chain-of-Thought。个性化学习路径记录用户的提问历史和知识盲点利用向量数据库存储用户画像从而推荐个性化的复习重点和习题向一个真正的“AI导师”迈进。开源与社区共建最理想的状态是将这个系统开源并设计一个贡献机制让广大考研学子可以共同维护和丰富这个408知识库使其成为一个持续更新的、活的社区知识资产。技术永远是为需求服务的。这个项目的起点是一个具体的学业痛点而RAG技术提供了恰到好处的解决方案。对于想要入门AI应用开发的朋友我强烈建议从这样一个有明确边界、有真实数据、有检验标准的垂直场景项目开始。你会遇到无数细节上的挑战但每解决一个你对整个技术栈的理解就会加深一层。这个过程远比单纯调参跑分要有趣和充实得多。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价