ConnectAI-E / Feishu-OpenAI-Stream-Chatbot

🎒 可以流式输出文本的飞书openai机器人 Feishu-OpenAI robot that can stream chat
https://www.connectai-e.com
GNU General Public License v3.0
146 stars 45 forks source link

默认支持上下文,怎么改比较合适 #17

Open Aatroy opened 1 year ago

Aatroy commented 1 year ago

我在发送回答之前,加了一个map, 根据userId 来 记录下 rootId, 随后在第二次用户提问的时候首先从map里拿rootId并更换之前的rootId。这里改了之后是默认支持了上下文,但是发现一直都会对问题的重复回答。比如我一个问题在1日晚7点问了一次,当时回答之后,夜里和第二天仍然会不定时回答这个问题

bourne7 commented 1 year ago

这个问题我想过,但是在这种单列聊天的场景里面,是不好解决的。网页 ChatGPT 是后台做了默认添加的。并且网页端的由于左侧已经有了会话这个概念,所以可以方便的区分 “这次调用是哪一个会话的”。

而这些在聊天窗口的情况下,都是不好实现的。我之前是想着加这个,但是我认为不好加,并且使用逻辑会更复杂。比如有以下几种形式:

  1. 默认携带能够携带的最长的上下文。这种实现最简单,但是只能支持单会话。
  2. 用户提问的时候加入时间戳(或者手动打tag),然后带入时间戳附近的一些上下文。这种用户用起来不太友好。
  3. 对历史记录做向量化。这种我认为是最强的了。实施成本不算太高,但是会导致服务器性能压力大+费用增加。刚好 Embedding 也是官方支持的形式。

难以处理的点在于:当有多个系列的对话的时候,没有简单友好的方式让用户区分。

我认为官网网页那种左侧记录会话的形式,是目前比较好的一种方式了。不过我认为后续的话,向量化是最好的形式。加上一些简单的指令,比如 clear 之类的,能做到更灵活的上下文对话。

希望这些能帮到你😉

Aatroy commented 1 year ago

会话永远是默认当前的上下文。类比 git stash , 用户通过 stash save 之后直接 clear ,stash pop(卡片list) 可以取出指定的会话呢。 数据放入用户的数据库中,是否也是一种解决方案? @bourne7

bourne7 commented 1 year ago

我认为可行。这种我认为和上面的第2种差不多,等于是用户手动在管理自己的各种会话。实现起来倒是不麻烦,但是用户使用起来么。。。我觉得非程序员要掌握这个用法是比较麻烦的。但是如果你觉得有用的话,可以尝试弄一下吧(●'◡'●)

Aatroy commented 1 year ago

不是的,我的意思是用户在发送了一个指定的词语,如 stash/ 会话 (clear / 清除) @,这样出来一个卡片,随之点击选择自己的会话,和官网的管理只多了一个输入指令,但是达不到像官方一样点击之后直接显示该会话的历史会话(这个目前我想好像只能通过卡片的回复实现 (●'◡'●)) @bourne7

bourne7 commented 1 year ago

还是有很多细节要考虑的。比如现在官网的那种,按照时间进行分类;删除功能;上下文预览功能。 这些官网的实现形式是比较“自然”的,要将这些功能都搬过来,还不是通过纯命令行的形式,而是通过卡片的话,我觉得工作量会大一些。当然我自己对飞书API不是特别熟悉哈。

bourne7 commented 1 year ago

官网还有一个细节:它的储存会话的标题,本身也是调用 GPT 来生成的,所以给人的感觉就是“看到左侧每一行,就知道里面的大概内容”。

我认为要设计的让用户非常友好的使用,还是有难度的。(❁´◡`❁)

Aatroy commented 1 year ago

okok,还是大道从简!(^o^)/~