From 1cea2e077eac8b9e4f827a844852a108026d4f31 Mon Sep 17 00:00:00 2001 From: luojh Date: Mon, 24 Jun 2024 11:21:08 +0800 Subject: [PATCH] modified: pages/_wiki/doc/howtoask.md, add some advice --- pages/_wiki/doc/howtoask.md | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/pages/_wiki/doc/howtoask.md b/pages/_wiki/doc/howtoask.md index cb2970d15e..6dea2ae1a3 100644 --- a/pages/_wiki/doc/howtoask.md +++ b/pages/_wiki/doc/howtoask.md @@ -23,10 +23,12 @@ License: CC-BY-NC-SA 4.0 ### 阅读已有的信息 {#read-existing-info} -很多时候遇到的问题会伴随着错误信息,至少分一点点耐心去读一下错误信息可能对解决问题很有帮助。如果有能力的话,尝试从日志等地方收集相关的信息也很可能会有帮助。 +很多时候遇到的问题会伴随着**错误信息**,至少分一点点耐心去读一下错误信息可能对解决问题很有帮助。如果有能力的话,尝试从日志等地方收集相关的信息也很可能会有帮助。 当然不少错误信息都是英语,不过能来到科大的同学高考大概都是需要考英语的,错误信息大部分时候都不会包含长难复杂句式(比高考英语的难阅读理解简单)。实在不行的话,借助词典或者机器翻译软件(考虑近年深度学习的巨大进步,2024 年的机器翻译发展水平已经很高了;并且计算机领域的词汇也就那些),也可以帮助阅读并尝试理解含义。 +注:一般而言,程序输出会有正常或不正常之分。包含有`error`、`E: `等字样或红色的输出通常表示错误,包含`warn`、`W: `、`warning`或黄色的输出通常表示警告。而往往,**第一个出现的错误指明最重要的问题**,故**应该从第一处报错开始理解、搜索、解决问题**。这是因为,第一处报错后,程序事实上已经处于不正常的状态,继续试图执行可能会导致大量的由第一个错误引发的其他错误或者误报。例外的是,有些程序可能会将其子进程/程序的错误信息输出在前面,例如`subprocess xxx returned error code xxx`,这类信息可能搜索效果不好,故需要找到错误最初发出的地方并搜索最初发出的错误信息。 + - 反例:镜像站怎么挂了 对应提问的截图中的错误信息节选: @@ -39,7 +41,7 @@ License: CC-BY-NC-SA 4.0 这里从图上命令输出的最后一行就可以看到,`apt` 给出了运行 `apt-get update` 的建议。如果甚至都没有去试一试就直接截个图问别人,那么很不幸,得不到好脸色恐怕也是意料之中的事情。 -- 反例:为什么我装不了 pytorch +- 反例:为什么我装不了 `pytorch` 执行的命令与错误信息: @@ -73,7 +75,7 @@ License: CC-BY-NC-SA 4.0 [notice] To update, run: pip install --upgrade pip ``` - 可以看到,异常(exception)的内容是 `You tried to install "pytorch". The package named for PyTorch is "torch"`,意思就是说,要安装的东西的名字应该是 torch 而不是 pytorch,所以解决方法就是跑的命令从 `pip install pytorch` 改成 `pip install torch`。 + 可以看到,异常(exception)的内容是 `You tried to install "pytorch". The package named for PyTorch is "torch"`,意思就是说,要安装的东西的名字应该是`torch` 而不是 `pytorch`,所以解决方法就是跑的命令从 `pip install pytorch` 改成 `pip install torch`。 - 反例:为什么我的程序编译不了 @@ -107,11 +109,13 @@ python argparse 最简单的几个技巧: -- 去掉「为什么」这样的副词与「的」这样的助词 -- 使用空格分割搜索关键词 -- 去掉只在你的计算机上有的信息(比如说用户名、主机名——比如如果你的用户名是 john123,并且搜索的时候带上了输出里面的 john123,那么搜索引擎可能会尽量匹配结果里面有 john123 的结果,这在几乎所有的时候都是不符合预期的) -- 可能需要去掉查询里面的横线 `-`:搜索引擎很可能将其解释为「以横线(减号)开头的查询词不允许包含在结果中」 -- 善于使用搜索引擎的特殊功能,例如在 Bing 搜索中,使用双引号 `""` 可以要求结果中必须含有被双引号(注意是半角双引号 `"` )括起的内容,使用加号 `+` 开头可以强制其搜索您给出的所有内容。有关 Bing 的此类特殊功能(称为*search operators*),Microsoft 提供了[文档](https://support.microsoft.com/en-us/topic/advanced-search-options-b92e25f1-0085-4271-bdf9-14aaea720930),其他搜索引擎也可能有类似的功能。 +- 去掉「为什么」这样的副词与「的」这样的助词(尽管现代搜索引擎一般会默认忽略这些内容); +- 使用空格分割搜索关键词; +- 去掉只在你的计算机上有的信息(比如说用户名、主机名、变量名等等你自己选择的名称——比如如果你的用户名是 `john123`,并且搜索的时候带上了输出里面的 `john123`,那么搜索引擎可能会尽量匹配结果里面有 `john123` 的结果,这在几乎所有的时候都是不符合预期的); +- 可能需要去掉查询里面的横线 `-`:搜索引擎很可能将其解释为「以横线(减号)开头的查询词不允许包含在结果中」; +- 善于使用搜索引擎的特殊功能:例如在 Bing 搜索中,使用双引号 `"Something"` 可以要求结果中必须含有被双引号(注意是半角双引号 `"` )括起的内容,使用加号 `+Something` 开头可以强制其搜索您给出的所有内容。有关此类特殊功能(称为*search operators*),Microsoft 提供了 Bing 搜索的[文档](https://support.microsoft.com/en-us/topic/advanced-search-options-b92e25f1-0085-4271-bdf9-14aaea720930),其他搜索引擎也应该有类似的功能,可以查找它们的文档获取相关帮助。 +- 如果你的工具给出了任何的错误代码:搜索`工具名称 错误代码`比搜索错误的文本提示有效得多。 +- 使用英语的输出信息:中文版工具的输出查找结果可能比英语版工具输出的查找结果少,故查找程序输出时使用英语版本的输出往往能找到更多更好的结果。 作为一个例子,对于下面这个「问题」: @@ -248,17 +252,19 @@ B (13:00): 这样,你应该 ZZZZZZZ ### 尽可能提供「最小可复现样例」 {#mre} -很少会有人愿意自愿帮助别人调试几百行的代码,或者配置一致的非常复杂的环境,因此**最小可复现样例**(Minimal reproducible example,MRE)可以很大程度帮助他人调试,并且在某些情况下甚至可以直接定位问题。最小可复现样例一般是一个**完整**的程序代码或者执行流程,与产生错误**无关的部分不包含**在这样的样例里面。 +很少会有人愿意自愿帮助别人调试几百行的代码,或者配置一致的非常复杂的环境,因此**最小可复现样例**(Minimal reproducible example,MRE)可以很大程度帮助他人调试,并且在某些情况下甚至可以直接定位问题。最小可复现样例一般是一个**完整**的程序代码或者执行流程,与产生错误**无关的部分不包含**在这样的样例里面。一个简单的获得这类样例的方式是,将你的代码不断二分,始终试图保持原有的错误并逐步抛弃与问题无关的部分,最后得到问题可能出现的小区间。 一种类型的反例是:只给了一段无法直接编译的很长的函数,函数里面调用了各种第三方库或者自己的结构体/类的方法,但是这些信息不在提供的内容中,这会给解决问题带来不小的困难。 +事实上,由于最小可复现样例结构通常比较简单,其中的问题便于观察,可能在制作这样的样例的过程中,通过逐步排除没有问题的代码,你自己就能发现产生问题的原因。 + ### 提供必要的问题描述与相关信息 {#provide-necessary-info} 必要的描述与信息可能包括: - 具体问题是什么 - 引发问题的命令/代码 -- 报错信息 +- 报错信息(注:如上文所述,通常只有前面显示的报错信息是关键的,故可以尝试先从前一条/几条有效的报错信息开始提问) - 自己尝试过用什么方法解决 - 系统与软件的版本信息(例如,如果你想在一个主要讨论 Linux 的群里面问 Windows 下的问题,务必把这一点说清楚) @@ -311,11 +317,12 @@ A2: 要用 curl.exe 调用才行 ### 避免拍屏 {#use-screenshots} -除非实在无法截图,否则不要拍屏,因为: +除非实在无法截图(例如,系统初起阶段,但这一阶段也可以通过虚拟机等等方式截图),否则不要拍屏,因为: - 不美观 -- 字/图像可能会拍不清楚 +- 字/图像可能会拍不清楚,因为有种现象叫做“莫尔纹” - 其他人可能需要扭脖子才能正确看到内容 +- 不便于以后遇到同样问题的人搜索 ## 如果没有人回答 {#if-no-answer} @@ -413,5 +420,6 @@ A2: 要用 curl.exe 调用才行 大语言模型(GPT)的工作模式简单来讲是:每次用户发送消息时,GPT 都会从最开头开始分析内容,到用户本次发送的信息结束后再开始生成。这样带来了两个问题: -- 对于超长的对话,每一次继续对话都会浪费不少的钱——假设当前的对话前,大语言模型分析了一个很长的网页,花费了一块钱,那么基于这段对话作为背景,**每次**发送一条消息,都会再花一块钱。 +- 对于超长的对话,每一次继续对话都会浪费不少的钱——假设当前的对话前,大语言模型分析了一个很长的网页,花费了一块钱,那么基于这段对话作为背景,**每次**发送一条消息,都会再花至少一块钱。 - 相比于短文本,GPT 对长文本更容易产生「**幻觉**」,即更容易输出与实际情况不相符的内容。 +- 如果你发现 GPT 在某种情况下工作不正常,可以要求其重新开始接受输入(抛弃之前的内容)或重新开始会话。重新开始后,更应该调整提问的策略。