V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  geelaw  ›  全部回复第 15 页 / 共 177 页
回复总数  3530
1 ... 11  12  13  14  15  16  17  18  19  20 ... 177  
@dnfQzjPBXtWmML #38 不是很确定你的数据来自什么环境,同款和类似的对话我这边是几秒钟。我比较好奇你认为每个数值分别应该是多少。

此外,你似乎没有理解我的意思,我是说 OpenAI 的 API 到底是类似第一种还是第二种实现(只要一次累积的 tokens 数量没有太大),最终网页上显示的效果没有区别。

考虑 2000 tokens 且每 token 有 4 个字符的情况,若每次传输到目前为止的总文本,最终会传送至少 7.6 MB ;若每次只传输增量,这一数值可以降低到 7.8 KB 。我只能说希望现在的软件工程师不要把性能进步都吃掉,恢复一点上个世纪的人的美好品质。
@dnfQzjPBXtWmML #30 这很奇怪吗?如果服务器快速产生事件,延迟很小但带宽也很小,那么客户端每次网络 IO 只能看到一部份事件;如果服务器慢速产生事件,延迟很大且带宽很大,那么客户端第一次网络 IO 很可能会看到累积的好多事件。每次 IO 之后操作了 DOM ,并且下次进入 IO 等待的时候浏览器会渲染,因此会看到动画效果。
@dnfQzjPBXtWmML #14 Good point. 我看了一下,并且调试了一下,如果在等待数据回传的时候下断点,等一会儿再让程序继续,则动画会直接跳到最终状态。因此我之前说“4 增加动画”是错误的,此外我查了文档

https://github.com/openai/openai-cookbook/blob/main/examples/How_to_stream_completions.ipynb

说明使用 stream 的时候每个 event 只传送一个 token ,但继续了解 Streams API

https://developer.mozilla.org/en-US/docs/Web/API/Streams_API

之后我意识到 event 的边界是 API-supplier-defined ,即应用层概念。于是我们可以问:

> OpenAI 的 API 实现里,是每次得到新的 token 就立刻追加一个 event ,还是数个 tokens 一起组成数个 events 并发送?

也就是代码是类似

while (HasNextToken())
{
Respond(GetNextToken());
}

还是类似

while (HasNextToken())
{
for (int i = 0; i <10 && HasNextToken(); ++i)
{
tokens[i] = GetNextToken();
}
Respond(tokens);
}

第一种情况,我认为 API 是在一个 token 一个 token 地返回数据,虽然传输层可以打包;第二种情况,我认为 API 一次传输了数个 tokens ,虽然传输层可以分成多个 packets 发送。

但或许这个问题并不重要,token 生成、网络传输的延迟、客户端异步读取收到的数据,这些结合在一起自动导致了客户端动画。

另外我对 message.content.parts[0] 每次都是到目前为止完整的文本而不是只发送变化的文本感到震惊,毕竟这会导致通信复杂度上升到 Theta(n^2)。
@airyland #7 我理解 OP 所问的是为什么网页上回答是几个词几个词往外蹦。

1. 模型是一个 token 一个 token 输出的
2. 用户在网页看到的是几个词几个词输出的
3. 网页调用的 API 是一个词一个词返回数据到客户端的
4. 网页调用 API 后增加动画让回答一个词一个词显示

1 和 2 都成立,但 1 不是 2 的原因,4 才是 2 的原因,并且 3 不成立。这样说清楚了吗?

关于 3 不成立,可以参考 https://stackoverflow.com/questions/75826303/is-there-any-way-to-stream-response-word-by-word-of-chatgpt-api-directly-in-reac 这个 StackOverflow 问题的存在就说明 OpenAI 的 API 并不是一个词一个词传送的。
@noe132 #2
@airyland #3
@jimages #4
诸位似乎有点小看电脑的运行速度或者小看上下文切换和网络传输的延迟了。模型确实是一个一个预测的,但用户界面上几个字/词几个字/词显示回答纯粹是表演,API 里即使用 stream=True 也是一大段儿一大段儿收到回复的,否则反复多轮传输很不划算。
2023-10-13 00:57:20 +08:00
回复了 jeesk 创建的主题 程序员 最近几年的文件安全问题越发严重。
@geelaw #3 更正一下,Apple 扫描的是儿童性虐待(色情)内容,是我之前忘记 CSAM 的 S = sexual 了。
2023-10-13 00:55:16 +08:00
回复了 jeesk 创建的主题 程序员 最近几年的文件安全问题越发严重。
sexy 的意思是性感,不是色情,误用会导致意思表达严重偏差。Apple 尝试扫描的是虐童( child abuse ),不仅仅是色情( pornography )。

Google Drive 的事件是共享导致的,似乎不共享就不会扫描,而且后果并不是删除而是禁止共享,并且这也是协议中明确表达的了。不要用不实信息作为动机和论据,不稳固。
要考虑算法是否安全,第一步是理解什么叫做“安全”,对于用户 ID 这种对象,我不了解是否有标准的安全定义,所以无法谈论安全性。
2023-10-07 03:57:19 +08:00
回复了 LonnyWong 创建的主题 程序员 go exec cmd /c 处理空格和双引号问题,大家有什么好办法吗?
@ysc3839 #15 我以为之前已经算是提到了这个区别了。cmd 有自己的转义,但 cmd 当然不负责外部命令如何理解命令行。MSVC CRT 解析 argv 不是 CommandLineToArgvW 我倒是不知道,另外我刚发现 CommandLineToArgvW 读取空格开头的字符串时会把第一个 argv 设置为空串 orz

除了提醒 lpCmdLine 不需要有 argv 的格式,还应该注意即使 lpCmdLine 解析为 argv ,第一个参数也不一定是程序的名字或者路径。
2023-10-06 23:32:07 +08:00
回复了 LonnyWong 创建的主题 程序员 go exec cmd /c 处理空格和双引号问题,大家有什么好办法吗?
另外 cmd 本身还有自己的内部命令和转义,比如 ^、管道、重定向,除非你的目的就是完全按照 cmd 执行命令,否则用 cmd /c 是错误的。

如果你想用 cmd /c ,那就不能用 argv 传参,而要用直接可以 ShellExecute/CreateProcess 的 API ,这样才能确保命令行准确传递(而不是经过 argv 互转,这个转换对 command line 来说不“往返”,对 argv 往返)。
2023-10-06 23:25:51 +08:00
回复了 LonnyWong 创建的主题 程序员 go exec cmd /c 处理空格和双引号问题,大家有什么好办法吗?
@LonnyWong Windows 上标准解析命令行的方式是有文档的,https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-commandlinetoargvw

解析方法如下(我随便瞎写的,不一定准确):
0. 若字符串只有空格,则设置 argc 为 1 ,argv[0] 为空串,否则转到 1
1. 去掉开头的空格,若已经没有字符,则结束,否则设置状态为无 quote ,设置当前实参为空字符串,转到 2
2. 下一个字符
2.1. 如果现在是无 quote 且这个字符是空格,则把当前实参加入 argv 并转到 1
2.2. 如果接下来有 2n 个 \ 之后紧跟一个 ",则在当前实参中追加 n 个 \,反转 quote 状态,并转到 2
2.3. (2n+1) \ + ",追加 n 个 \ 和 1 个 ",转到 2
2.4. 其他字符,则追加当前字符并转到 2
3. 把最后一个实参加入 argv
2023-10-06 22:34:44 +08:00
回复了 LonnyWong 创建的主题 程序员 go exec cmd /c 处理空格和双引号问题,大家有什么好办法吗?
例子:
exec.Command("C:\\WINDOWS\\System32\|OpenSSH\\ssh.exe", "-V")

go 和 ssh 理应 Windows 上能正确互转 command line 和 argv 。
2023-10-06 22:31:26 +08:00
回复了 LonnyWong 创建的主题 程序员 go exec cmd /c 处理空格和双引号问题,大家有什么好办法吗?
为什么要多此一举透过 cmd ?另外从 go 的 API 设计可以看出它必须用 Unix 的方式传入 argv ,而不是 Windows 的 command line 。而 cmd 是按照 command line 而不是 argv 读取命令的,因为同一组 argv 有无限种不同的 command line 表示,而且这些会被 cmd 理解为不同的意思,所以不存在可靠的用 go 的 exec 调用 cmd 的方法。

如果你要调用 ssh 并传入 -V ,可以直接传入合适的 argv 。
2023-10-04 21:37:57 +08:00
回复了 xloger 创建的主题 Java 请教个 Java LinkedList 用法的问题
只有反复修改的情况下才需要考虑数组/链表等数据结构。

>我需要将用户手机的全部图片、视频按时间倒序添加到一个 List 里。基于 Android 的 API 限制,图片和视频的查询是分开的,故有大量的中间插入需求。

这个很简单,你可以先把所有的图片和视频都弄到一个巨大的 ArrayList 里,然后再排序。我没做过 Android 开发,猜测 API 提供按时间顺序分别获取图片、视频的功能,那么你可以先准备好两个 ArrayList ,分别得到正确顺序的图片、视频,然后做一轮归并即可。
2023-10-04 03:01:44 +08:00
回复了 zzzkkk 创建的主题 PowerShell powershell setx 变量后无法自身得到变量值
setx 设置的环境变量并不会立刻被 cmd.exe 读取啊,但是 explorer.exe 会知道,所以下次从 explorer.exe 启动 cmd.exe 的时候能 echo %classpath% 看到。

PowerShell 里读取进程环境变量的方式是 $env:EnvironmentVariableName ,而 %classpath% 只是普通字符串。

Write-Verbose $env:classpath -Verbose

就可以在 verbose 流看到了。
@MFWT #14
@aliveyang #16
@hanqian #25

我印象里大多数软件都是不额外建立目录的,但多数软件的安装程序的默认目录都是不存在的目录(比如目录是 C:\Program Files\ProductName )而且如果目标目录安装前已经存在且不是这个软件的旧版本(原地更新的话)会警告用户。

@yigecaiji #36

规范是默认安装在 %LOCALAPPDATA%\Programs (单用户)或者 %PROGRAMFILES%(整个系统)里面,并且建立 ProductName 或者 CompanyName\ProductName 子目录,以及 Windows 应用商店应用由 Windows 部署。
2023-09-28 16:40:56 +08:00
回复了 tool2d 创建的主题 程序员 感觉 double 精度不够用啊
第一个考虑的方向是条件数,从三个平直系坐标计算三角形面积,在所给的输入处的条件数是 400 亿,这说明计算结果只能期待 <6 位有效数字。

第二个考虑的方向是误差累积,楼主的算法,绝对误差是 (sum |x_i| + sum |y_i|) * eps (这个界比较松)。

如果先把任意一个点平移到原点,则绝对误差是 (sum |x_i - x_1| + sum |y_i - y_1|) * 2eps ,是更好的策略。
2023-09-27 12:28:18 +08:00
回复了 fatyoung 创建的主题 Linux 关于 Linux 进程权限和用户权限的一点疑问
是运维先建立好账户设置好权限,然后再把部署好的程序以那个账户启动。这个问题和是哪种操作系统也没有关系。

> 然后我请求了一个接口,去访问某个文件,那我怎么确认该请求是否有权限访问

如果程序想要知道自己是否有权限访问某个文件,惟一正确的方法是尝试以需要的访问方式(读、写、读写)打开并使用。提前检查后再打开无意义,因为在检查完毕后、打开之前,别的程序可以修改文件的权限;如果不想要访问文件,则是否有权限访问的问题是无意义的。
2023-09-21 17:17:00 +08:00
回复了 sugarsalt 创建的主题 程序员 求教, bat 脚本里,设了 chcp 仍然有中文无法正确显示
至于原来的代码为什么不行,假设 batch 是 UTF-8 保存的,且本机代码页是 936 ,那么最终有颜色的输出结果是 "ʲô",这是把 "什么" 用 Windows-936 (~ GB) 编码之后再用 UTF-8 解码,这说明 cmd 设置变量的时候,是用 UTF-8 解读 batch 文件的(从而正确把文件中的字节解读为 "什么"),但是数据传入 findstr.exe 之后变成了 Windows-936 ,这很可能是因为 findstr.exe 使用的不是 WCHAR 而是 CHAR (因此 argv 是根据系统代码页,也就是 936 ,解读的,因此 findstr.exe 内部看到的是 GB 编码的 "什么"),并且在最后 findstr.exe 向控制台以输出了它所得到的字节流(即输出了 GB 编码的 "什么")——但控制台的代码页是 UTF-8 ,因此它把 GB 编码的 "什么" 用 UTF-8 解读并显示。
2023-09-21 16:38:15 +08:00
回复了 sugarsalt 创建的主题 程序员 求教, bat 脚本里,设了 chcp 仍然有中文无法正确显示
这段代码相当糟糕,是利用 findstr 这个工具显示文件名,因此你传入的字符串必须是合法的文件名,而且显示的时候会覆盖当前目录下的同名文件——总之就是个不定时炸弹。

如果必须要用 batch ,推荐 https://gist.github.com/mlocati/fdabcaeb8071d5c75a2d51712db24011
否则可以考虑 PowerShell

另外请不要在 bat 里面 chcp ,这是在劫持用户的 console ,而且我没找到如何让 Windows 以固定的编码读取 batch 的功能,它或许永远是以系统代码页读取 batch 并运行的,也可能是按照当前代码页一次读取一行运行的。考虑如下 UTF-8 的 batch:

chcp 932>nul 2>nul
chcp 65001>nul 2>nul && echo ¿

其中 echo 的字符是 U+00BF ,它的 UTF-8 编码是 0xC2 0xBF ,一开始的 932 是 Windows 的 Shift JIS 实现,在这个代码页里 0xC2 不是合法的开头字节,因此在默认的日语 Windows 上执行它会产生不可预知的后果。

实际效果是打印出来的并不是倒转的问号,而是 ツソ 这两个符号。
1 ... 11  12  13  14  15  16  17  18  19  20 ... 177  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1116 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 31ms · UTC 17:59 · PVG 01:59 · LAX 09:59 · JFK 12:59
Developed with CodeLauncher
♥ Do have faith in what you're doing.