在B站学习 图灵程序员-诸葛 的LangChain入门课程《基于Redis保存历史聊天信息》。在实践代码时遇到了一些问题,在这里记录一下,希望能帮助到也在学习的同学。话不多说,上代码,这段代码使用langchain_redis来持久化大模型对话的聊天记录。

from langchain_redis import RedisChatMessageHistory  
from langchain_openai import ChatOpenAI  
  
llm = ChatOpenAI(  
    model="qwen-plus",  
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",  
    api_key="[Your API KEY]"  
)  
  
history = RedisChatMessageHistory(  
    session_id="test",  
    redis_url="redis://localhost:6379/0"  
)  
history.add_user_message("你是谁?")  
ai_message = llm.invoke(history.messages)  
print(ai_message.content)  
history.add_message(ai_message)  
  
history.add_user_message("请重复一次")  
ai_message2 = llm.invoke(history.messages)  
print(ai_message2.content)  
history.add_message(ai_message2)

参考 LangChain Redis文档 用Docker运行Redis

To run Redis locally, you can use Docker:

docker run --name langchain-redis -d -p 6379:6379 redis redis-server --save 60 1 --loglevel warning

Docker镜像启动后,使用Redis Insight顺利的连接上了Redis。但代码运行时访问Redis时收到错误

redis.exceptions.ResponseError: unknown command 'FT.INFO', with args beginning with: 'idx:chat_history' 

Redis小白完全不懂,搜索得知错误的原因是 Redis 没有加载 RediSearch 模块(FT.前缀的命令属于RediSearch的功能)

实测上面这条命令启动的Redis中确实没有安装RediSearch模块。验证方法如下

  1. 在Redis容器的terminal中输入 redis-cli 进入redis交互式命令行
  2. 在redis交互式命令行中输入 MODULE LIST 查看加载的模块

得到的结果是(empty array),这意味着当前Redis容器没有加载任何模块。

网络搜索得到的解决方式是使用 redis/redis-stack 镜像,因为这个镜像里包含了所需的RediSearch模块。在docker hub里找到了两个类似的镜像

  • redis/redis-stack
  • redis/redis-stack-server

redis/redis-stack包含了我不需要的Redi Insight(官方的图形化访问Redis的工具),所以我选择使用体积更小的 redis/redis-stack-server。启动Redis容器的命令改为

docker run --name langchain-redis -d -p 6379:6379 redis/redis-stack-server

注意这里命令的变化。

这里记录一下我踩的坑,我开始使用了下面这条命令运行redis/redis-stack-server镜像

docker run --name langchain-redis -d -p 6379:6379 redis/redis-stack-server redis-server --save 60 1 --loglevel warning

发现启动后的Redis并没有加载任何模块。查阅资料后发现,使用redis-server命令启动Redis时默认不会加载任何模块,想要使用RediSearch模块,需要在执行redis-server命令时加上--loadmodule参数指定要加载的模块

  docker run --name langchain-redis -d -p 6379:6379 redis/redis-stack-server redis-server --save 60 1 --loglevel warning --loadmodule /opt/redis-stack/lib/redisearch.so --loadmodule /opt/redis-stack/lib/rejson.so

当我们使用redis/redis-stack-server镜像时,容器启动时会执行名为entrypoint.sh的脚本,这个脚本里就使用了redis-server加--loadmodule的方式启动Redis。这意味着我们在启动redis/redis-stack-server时不需要显式指定任何命令,只需要如下命令就可以在启动Redis的同时加载RediSearch模块

docker run --name langchain-redis -d -p 6379:6379 redis/redis-stack-server

现在运行本文开头的python代码就能正常执行啦。回头又看了一遍B站的视频教程,发现Up主打开的LangChain网页其实是 Redis Chat Message History ,这里面其实已经提供了正确启动Redis的命令。没认真听课趟了个坑就不奇怪了,大家一定要认真听课啊。

本文由博客一文多发平台 OpenWrite 发布!

人月新话
1 声望0 粉丝