Skip to content

Commit

Permalink
howtoask: set header ids manually
Browse files Browse the repository at this point in the history
  • Loading branch information
taoky committed May 31, 2024
1 parent 79363b0 commit 1745602
Showing 1 changed file with 35 additions and 35 deletions.
70 changes: 35 additions & 35 deletions pages/_wiki/user/taoky/howtoask.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

License: CC-BY-NC-SA 4.0

## 为什么需要再写一份这样的指南
## 为什么需要再写一份这样的指南 {#why-this-guide}

关于如何提问,有一些相关的文档,诸如:

Expand All @@ -19,11 +19,11 @@ License: CC-BY-NC-SA 4.0

也需要注意的是,以下内容不是能够机械性执行的检查单,注意需要「具体问题具体分析」。

## 提问之前
## 提问之前 {#before-asking}

请先尝试自己解决问题:有的时候解决方法比想像的要简单得多(并且自己解决也比问别人快得多)。以下会给出一些问题解决的通用思路。

### 阅读已有的信息
### 阅读已有的信息 {#read-existing-info}

很多时候遇到的问题会伴随着错误信息,至少分一点点耐心去读一下错误信息可能对解决问题很有帮助。如果有能力的话,尝试从日志等地方收集相关的信息也很可能会有帮助。

Expand Down Expand Up @@ -87,25 +87,25 @@ License: CC-BY-NC-SA 4.0

可以看到,输出中报错信息明确了是 `No such file or directory`(没有对应的文件或文件夹),代表给的文件程序找不到。仔细检查可以发现是命令里面把名字敲错了。

### 利用搜索引擎等工具
### 利用搜索引擎等工具 {#use-search-engine}

尽管近两年大语言模型发展迅速,但是搜索引擎在解决问题上仍然有着不可或缺的作用。

#### 选择搜索引擎
#### 选择搜索引擎 {#choose-search-engine}

作为业界不成文的「共识」,对常用搜索引擎的排序是:谷歌 > 必应国际版 > 必应国内版 > 百度。可以都试试,根据自己的实际情况选择。

#### 搜索相关项目的手册/FAQ 等信息
#### 搜索相关项目的手册/FAQ 等信息 {#search-docs}

在某些场景下,直接搜索对应项目的帮助文档、手册、FAQ 等是比搜索报错信息更好的选择。例如,如果我在使用 Python 的 `argparse` 模块时遇到了问题,可能最好的方式是先搜索其手册信息,在手册中寻找需要的内容:

```
```text
python argparse
```

(这么搜索对于合格的搜索引擎,足以将其手册等关键信息排在结果最前面)

#### 使用合适的查询
#### 使用合适的查询 {#use-proper-query}

最简单的几个技巧:

Expand All @@ -116,7 +116,7 @@ python argparse

作为一个例子,对于下面这个「问题」:

```
```text
为什么我运行 apt update 会输出这个:
Reading package lists... Done
E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)
Expand All @@ -127,43 +127,43 @@ W: Problem unlinking the file /var/cache/apt/srcpkgcache.bin - RemoveCaches (13:

首先判断(最)重要的信息,并且调整:

```
```text
为什么我运行 apt update 会输出这个:E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)
```

然后使用上面的简单策略处理查询:

```
```text
apt update 输出 E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)
```

(「输出」这两个字甚至也可以不要)

直接贴到任何搜索引擎(必应/谷歌),甚至百度给出的结果链接都是对应的解决方法。

#### 筛选结果
#### 筛选结果 {#filter-results}

搜索引擎可能会返回广告,可以考虑为自己的浏览器安装反广告扩展(例如 uBlock Origin)排除这一部分内容。

有一小部分网站(大多出于商业目的)会不加选择地收集垃圾内容,并且不择手段让搜索引擎相信它们包含有效的信息。这些网站被称为「内容农场」。这些网站的内容当然对解决你的问题也基本上不会有帮助。有关内容农场的特征等信息,可以阅读「少数派」的文章:[清理「内容农场」,还你清爽的 Google 中文搜索体验](https://sspai.com/post/69407)

对于搜索得到的结果,目前普遍(同样不成文)的认识是:一些网站的内容质量(例如 CSDN)普遍比其他的更低,中文结果的平均质量比英文结果低(很遗憾,这也是为什么更推荐使用英文搜索的重要原因之一)。在逐渐使用搜索引擎的过程中,对不同结果的质量也可以有更清晰的判断。

### 其他信息
### 其他信息 {#other-info}

从 2023 年初开始,大语言模型(GPT 等)逐渐普及。询问大语言模型同样也是很有效的问题解决途径(并且确实比真人更有耐心)。不过,这不代表不需要任何技巧,大语言模型就会自动施展魔法解决所有问题。有关详细信息,请参考本文「附录:如何正确向大语言模型提问」。

## 提问时的注意事项
## 提问时的注意事项 {#when-asking}

### 避免 X-Y 型问题
### 避免 X-Y 型问题 {#avoid-xy}

X-Y 型问题指代这样一种情况:你遇到了 X 问题,你相信用 Y 方法可以解决 X 问题,但是不知道怎么使用,因此向别人提问如何使用 Y 的问题,而不告诉其他人 X 问题的内容。如果用 Y 方法解决 X 问题的思路是错误的,那么这样的提问就是浪费时间。

在去年(2023)离世的陈皓先生曾在他的博客中介绍了 X-Y 型问题([Web Archive](https://web.archive.org/web/20240309145853/https://coolshell.cn/articles/10804.html)),由于其原始博客目前无法直接访问,以下摘录了其中提及的例子。

- 例子 1:获取字符串后三位字符?

```
```text
Q: 我怎么用 Shell 取得一个字符串的后 3 位字符?
A1: 如果这个字符的变量是$foo,你可以这样来 echo ${foo:-3}
A2: 为什么你要取后 3 位?你想干什么?
Expand All @@ -174,7 +174,7 @@ X-Y 型问题指代这样一种情况:你遇到了 X 问题,你相信用 Y

- 例子 2:获取文件大小?

```
```text
Q: 问一下大家,我如何得到一个文件的大小
A1: size = ls -l $file | awk '{print $5}'
Q: 哦,要是这个文件名是个目录呢?
Expand All @@ -190,7 +190,7 @@ X-Y 型问题指代这样一种情况:你遇到了 X 问题,你相信用 Y

另外这是一个大幅简略后实际出现的例子:

```
```text
Q: 有没有人在导入的时候遇到 TypeError: Can't create an SSLContext object without an ssl module? 的报错?
A1: 你编译的时候没加 ssl 模块吗
Q: 加了,我看了 csdn 上的教程 [截图]
Expand All @@ -205,11 +205,11 @@ A3: 20.04 源里面也有 3.9,可以直接 install python3.9

提问者的问题在于:**他实际的问题是「如何在 Ubuntu 20.04 下默认使用 Python3」,而不是「如何安装 Python3」**

### 避免「在吗」/「有人吗」
### 避免「在吗」/「有人吗」 {#ask-directly}

在私聊的场合下,直接提问比先只问「在吗」是更好、效率更高的选择,否则参考这个(虚构的)例子:

```
```text
A (8:00): 在吗?
B (13:00): 怎么了?
A (15:00): 我遇到了 XXXXXXX 错误,然后 YYYY 命令跑不了,怎么办?
Expand All @@ -218,18 +218,18 @@ B (16:00): 你应该 ZZZZZZZ

对比一下直接问:

```
```text
A (8:00): Hi,我遇到了 XXXXXXX 错误,然后 YYYY 命令跑不了,怎么办?
B (13:00): 这样,你应该 ZZZZZZZ
```

同样在群聊的场景下,直接问问题比问「有人吗」是更好的选择——毕竟其他人有充分的理由不理你(当然,如果你是群里的大红人,可能是另外一回事)。

### 避免「有没有人懂」
### 避免「有没有人懂」 {#justask}

一个糟糕的例子是在群聊里面问:

```
```text
有没有人懂 C++?有个问题想问问
```

Expand All @@ -241,19 +241,19 @@ B (13:00): 这样,你应该 ZZZZZZZ

一个改善后相对好一些的提问是:

```
```text
我遇到了一个问题,我的 C++ 程序需要运行一个 CUDA kernel,我要怎么写 cmake 来编译这个 kernel 并且让我的程序调用?
```

相关论述可参考 [不要问有没有人,请直接问](https://fars.ee/~justask.html)

### 尽可能提供「最小可复现样例」
### 尽可能提供「最小可复现样例」 {#mre}

很少会有人愿意自愿帮助别人调试几百行的代码,或者配置一致的非常复杂的环境,因此**最小可复现样例**(Minimal reproducible example,MRE)可以很大程度帮助他人调试,并且在某些情况下甚至可以直接定位问题。最小可复现样例一般是一个**完整**的程序代码或者执行流程,与产生错误**无关的部分不包含**在这样的样例里面。

一种类型的反例是:只给了一段无法直接编译的很长的函数,函数里面调用了各种第三方库或者自己的结构体/类的方法,但是这些信息不在提供的内容中,这会给解决问题带来不小的困难。

### 提供必要的问题描述与相关信息
### 提供必要的问题描述与相关信息 {#provide-necessary-info}

必要的描述与信息可能包括:

Expand All @@ -263,7 +263,7 @@ B (13:00): 这样,你应该 ZZZZZZZ
- 自己尝试过用什么方法解决
- 系统与软件的版本信息(例如,如果你想在一个主要讨论 Linux 的群里面问 Windows 下的问题,务必把这一点说清楚)

### 使用 Snippet/Gist/Pastebin 类型服务放问题相关的代码与报错
### 使用 Snippet/Gist/Pastebin 类型服务放问题相关的代码与报错 {#use-pastebin}

代码和报错信息可能会非常长,此时截图或者直接文本贴到群聊里面可能不是一个合适的选择

Expand All @@ -278,15 +278,15 @@ B (13:00): 这样,你应该 ZZZZZZZ

对于科大校内的同学,可以使用校内 GitLab([超算中心](https://git.ustc.edu.cn/)[LUG](https://git.lug.ustc.edu.cn/))的 Snippets。

### 避免拍屏
### 避免拍屏 {#use-screenshots}

除非实在无法截图,否则不要拍屏,因为:

- 不美观
- 字/图像可能会拍不清楚
- 其他人可能需要扭脖子才能正确看到内容

## 如果没有人回答
## 如果没有人回答 {#if-no-answer}

没有人回答问题 ≠ 被无视,在群聊中,如果认真提问却没有人回答,更有可能发生的事情是:看到问题的人完全不知道如何解决,仅此而已。同时也需要注意,群聊中(或者论坛中)的其他与你素不相识的人也没有必须回答问题的义务。

Expand All @@ -297,9 +297,9 @@ B (13:00): 这样,你应该 ZZZZZZZ
- 向对应服务/软件的维护人员提交工单
- Tip: 科大网络信息中心报修系统 <https://baoxiu.ustc.edu.cn/>

## 附录:如何正确向大语言模型提问
## 附录:如何正确向大语言模型提问 {#llm}

### 阅读本部分前,先阅读正文内容
### 阅读本部分前,先阅读正文内容 {#read-main-content-first}

对人类有效的提问策略,大多对大语言模型也有效。

Expand All @@ -311,7 +311,7 @@ B (13:00): 这样,你应该 ZZZZZZZ

- 原始例子

````
````text
Human: 如何在 Linux 下让 IPMI 向操作系统发送 NMI 信号?
GPT: 在 Linux 下通过 IPMI (Intelligent Platform Management Interface) 向系统发送 NMI(非屏蔽中断)信号,可以用于触发内核转储或进行内核调试。下面是具体的步骤:
Expand Down Expand Up @@ -350,7 +350,7 @@ B (13:00): 这样,你应该 ZZZZZZZ

- 末尾添加 `Be concise`

````
````text
Human: 如何在 Linux 下让 IPMI 向操作系统发送 NMI 信号?Be concise
GPT: 要在 Linux 下通过 IPMI 让 BMC 向操作系统发送 NMI(Non-Maskable Interrupt,即不可屏蔽中断)信号,你可以使用 `ipmitool` 工具。该工具允许你与服务器的 BMC 进行交互,并执行各种管理命令。
Expand All @@ -374,11 +374,11 @@ B (13:00): 这样,你应该 ZZZZZZZ
- 保证你有服务器的管理员权限,因为发送 NMI 信号通常需要较高的权限。
````

### 提问语言
### 提问语言 {#ask-language}

由于大语言模型的训练语料很多时候英文的数据量远大于中文,因此使用英文提问得到的结果质量可能比中文提问更好。国产的大语言模型可能可以缓解这个问题。

### 避免超长的对话
### 避免超长的对话 {#avoid-long-dialog}

大语言模型(GPT)的工作模式简单来讲是:每次用户发送消息时,GPT 都会从最开头开始分析内容,到用户本次发送的信息结束后再开始生成。这样带来了两个问题:

Expand Down

0 comments on commit 1745602

Please sign in to comment.