baidu_wenxin_session.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. from bot.session_manager import Session
  2. from common.log import logger
  3. """
  4. e.g. [
  5. {"role": "user", "content": "Who won the world series in 2020?"},
  6. {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
  7. {"role": "user", "content": "Where was it played?"}
  8. ]
  9. """
  10. class BaiduWenxinSession(Session):
  11. def __init__(self, session_id, system_prompt=None, model="gpt-3.5-turbo"):
  12. super().__init__(session_id, system_prompt)
  13. self.model = model
  14. # 百度文心不支持system prompt
  15. # self.reset()
  16. def discard_exceeding(self, max_tokens, cur_tokens=None):
  17. precise = True
  18. try:
  19. cur_tokens = self.calc_tokens()
  20. except Exception as e:
  21. precise = False
  22. if cur_tokens is None:
  23. raise e
  24. logger.debug("Exception when counting tokens precisely for query: {}".format(e))
  25. while cur_tokens > max_tokens:
  26. if len(self.messages) >= 2:
  27. self.messages.pop(0)
  28. self.messages.pop(0)
  29. else:
  30. logger.debug("max_tokens={}, total_tokens={}, len(messages)={}".format(max_tokens, cur_tokens, len(self.messages)))
  31. break
  32. if precise:
  33. cur_tokens = self.calc_tokens()
  34. else:
  35. cur_tokens = cur_tokens - max_tokens
  36. return cur_tokens
  37. def calc_tokens(self):
  38. return num_tokens_from_messages(self.messages, self.model)
  39. def num_tokens_from_messages(messages, model):
  40. """Returns the number of tokens used by a list of messages."""
  41. tokens = 0
  42. for msg in messages:
  43. # 官方token计算规则暂不明确: "大约为 token数为 "中文字 + 其他语种单词数 x 1.3"
  44. # 这里先直接根据字数粗略估算吧,暂不影响正常使用,仅在判断是否丢弃历史会话的时候会有偏差
  45. tokens += len(msg["content"])
  46. return tokens