TIL

在我Debug了2天后,才发现Django的ModelAdmin模块中, list_filter也会调用get_search_results函数来查询数据库
因此如果你设置了list_filter列表,但在admin页面上并没有成功筛选
可能是你自定义了get_search_results函数,对筛选结果进行了额外的操作。

关于Python的 __pycache__ 文件夹小记

ref: https://realpython.com/python-pycache/#what-actions-invalidate-the-cache

  • Python 中的 __pycache__ 文件夹是什么?
    Python模块的缓存文件夹,将需要的模块编译为字节码,并缓存(.pyc)到该文件夹中,实现更快的导入速度。
    除了__pycache__ 文件夹,Python还在内存中创建了模块缓存,缓存需要导入多次的模块,减少导入模块的开销。
  • 如何判断缓存的模块是否过期?
    默认基于时间戳判断,也可以基于哈希值
  • 即使使用了 from … import 语法,Python 还是会读取并编译整个模块,包括未使用的。
  • 可以在python命令后使用-X importtime参数来显示每个模块的导入时间
  • 递归删除所有 __pycache__ 文件夹(linux):find . -type d -name __pycache__ -exec rm -rf {} +
  • 如何禁止Python创建缓存文件?
    向 python 命令传递 -B 选项,或者设置环境变量PYTHONDONTWRITEBYTECODE=1
  • 集中存储缓存
    方法1:python -X pycache_prefix=/tmp/pycache calculator.py
    方法2:设置环境变量PYTHONPYCACHEPREFIX=/tmp/pycache
    它会在指定的文件夹下镜像项目的目录结构,由于这种集中式缓存的层次结构与项目结构相匹配,因此可以在多个项目之间共享该缓存文件夹

原来python的format函数是必需给所有的占位符赋值的,不能只赋值其中一个。
比如下面的代码会报错,因为country没有赋值

my_str = "My name is {name}, I'm from {country}"     
print( my_str.format(name='Versun') )     

所以如果对于用户输入的字符串,比如用于AI的提示词,用replace更合适些。

TIL: Linux查看具体进程的内存占用情况

cat /proc/[PID]/status | grep VmRSS

TIL-什么是RAG

RAG是Retrieval Augmented Generation的缩写,中文名为检索增强生成。

它是一种结合了信息检索和文本生成的技术,旨在增强大语言模型处理知识密集型任务的能力。

RAG的基本工作流程如下

  1. 检索:根据用户的查询,利用检索模型从外部知识库中获取相关的背景信息。通常是将查询向量化,然后在向量数据库中进行相似度搜索,找出最相关的若干条记录。
  2. 增强:将用户查询和检索到的背景信息一起嵌入到预设的提示模板中,生成增强后的提示。
  3. 生成:将增强后的提示输入到语言模型中,生成最终的输出文本。 通过融合外部知识,RAG可以让语言模型生成更加准确、符合上下文的回答,减少幻觉和错误信息。同时RAG也比较灵活,可以通过更新知识库来适应知识的变化,而无需重新训练整个语言模型

与微调(fine-tuning)相比,RAG有以下优势

  1. 更新知识更加高效,只需修改知识库即可,不用重新训练模型
  2. 更适合知识会随时间变化的动态场景
  3. 可以利用更大规模的外部知识,不受模型参数规模的限制