记一次OLLAMA+Milvus+Langchain部署和测试的踩坑
我的项目(https://gitee.com/lainyu/wx-bot-for-kumquat-king)V2版本需要使用langchain构建一个完整的意图识别系统,所以第一步,需要先把环境部署好。对于这一块,我是个新手。光是部署Redis,向量库和langchain就搞了一整天,一个简单的demo才跑通。记一下踩过的坑。
我的项目(https://gitee.com/lainyu/wx-bot-for-kumquat-king)V2版本需要使用langchain构建一个完整的意图识别系统,所以第一步,需要先把环境部署好。
对于这一块,我是个新手。光是部署Redis,向量库和langchain就搞了一整天,一个简单的demo才跑通。 记一下踩过的坑。
环境描述
为了免费,这些都是本地的。 之前由于心动,斥巨资1200买了一台linux工控机,非常好用,CPUi5,内存8G,硬盘500G,内置WIFI,散热比树莓派好太多了,所以Redis, 我的项目, 以及向量库都会放在工控机上,这台工控机就是我的生产环境了。 不过目前项目还是在本地电脑跑的,没做完嘛。
OLLAMA也是我的开发电脑上运行,毕竟不能指望1200的工控机还能部署LLM。
- 本地开发环境IP fastAPI:192.168.3.3:5005
- Ollama: 192.168.3.3:11434
- Redis server: 192.168.3.14:6379 # 如果只需要OLLAMA和Milvus,Redis可以跳过!
- Attu: 192.168.3.14:8787
- Milvus: 192.168.3.14:19530
- Minio: 192.168.3.14:9000/9001
- etcd: 192.168.3.14:2379
为什么不用chromadb?
chromadb确实可以在本地,或者内存上跑,第一次安装pip install chromadb会提示chromadb hashlib安装错误:
error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/
按照提示安装个1.6G的工具库就可以了。
但之后我发现chromadb会和tortoise-orm的lib有冲突,主要是pypika这个包的版本冲突。 这就很麻烦了,要么换python版本,我用的python3.13.1。换环境是不可能的,那只能弃用,把chromdb和tortoise-orm都卸了,还好我用的Poetry,能把依赖都卸了。 再重装tortoise-orm才解决。
ImportError: cannot import name 'ClickHouseQuery' from 'pypika.dialects'
为什么不用Milvus Lite?
因为Milvus lite不支持WINDOWS系统! 所以win下用pip install milvus_lite会报错!官网有说明:
步骤 和 目标
- 安装Docker Redis, Milvus, Attu。
- 跑通以下demo:
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.document_loaders import UnstructuredHTMLLoader
from langchain_ollama import OllamaEmbeddings
from langchain.vectorstores import Milvus
embeddings = OllamaEmbeddings(
model="shaw/dmeta-embedding-zh:latest",
base_url="http://192.168.3.3:11434"
)
loader = UnstructuredHTMLLoader("./README.html")
milvus_conn = {'uri': 'http://192.168.3.14:19530'}
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
vector_db = Milvus.from_documents(
docs,
embeddings,
connection_args=milvus_conn
)
query = "鑫茂园是什么?"
docs = vector_db.similarity_search(query)
print(docs[0].page_content)
Redis 配置
之前只是使用过Redis,但从没配置过, 第一次配置出现了很多问题。
根据docker hub redis上的使用说明,在工控机上,本地是可以使用redis-cli,也就是说,完全可以连接redis。 但是我这里属于局域网,需要修改配置文件。 在这个网站:https://redis.io/docs/latest/operate/oss_and_stack/management/config-file/ 找到一个配置文件的config,抄下来(wget 命令下github上的rawcontent也可以,但我在工控机上没科学上网,只能使用最原始的方法)。 修改以下配置:
bind=0.0.0.0
protected-mode no
说明: bind 0.0.0.0就是向当前所有网段开发, 由于redis上只存一些临时的对话信息,两三分钟清理一次,并不属于隐私,就把protected-mode关掉了。记住如果向网段开放,还不用密码登录,必须要把protected-mode关掉,否则连不上!
如果要加密码,应该像这样:
bind=0.0.0.0
requirepass foobared
把配置文件放到 /home/you/dockers/redis, 或者随意哪个,能记得住的directory都可以。 启动docker 命令:
docker run -p 6379:6379 --name redis -v /your_redis_conf_path/redis.conf:/etc/redis/redis.conf -v /your_mapping_redis_date/data:/data -d redis redis-server /etc/redis/redis.conf
噢… 好像我最后为了保险还是把requiredpass加上了🤣
测试:
#config.REDIS_HOST = '192.168.3.14'
#config.REDIS_PORT = 6379
redisHealth = 'YES' if redis.Redis(host=config.REDIS_HOST, port=config.REDIS_PORT, password=config.REDIS_PASS).ping() else 'NO'
print(redisHealth) #YES
Milvus standalone
Milvus的文档写得很好,但是用的都是openAI的例子,报错地方又比较奇怪。 导致卡了我很久。 先说Milvus Docker的安装,Milvus有两个依赖。 Minio和ETCD, Minio是做对象储存的开源系统,ETCD是存metadata的数据库。
官方提供了两种方式安装: https://milvus.io/docs/install_standalone-docker.md 和
https://milvus.io/docs/install_standalone-docker-compose.md, 用脚本或者docker-compose.yaml。 我不想用脚本管理,就直接使用了docker-compose的方式。
wget https://github.com/milvus-io/milvus/releases/download/v2.5.0-beta/milvus-standalone-docker-compose.yml -O docker-compose.yml
可以看看docker-compose.yml的内容,还能知道如何检查这些服务的health api口。直接启动:
sudo docker compose up -d
稍等一会就可以看到启动完成, Up x (healthy) 有healthy的字样表示安装完成:
到这里我以为大功告成了,准备切文档向量化了。 但上图的示例代码中,如论如何都跑不通,一直卡在这一步,报错, Win 请求地址无效,或者是pymilvus.exceptions.MilvusException: <MilvusException: (code=2, message=Fail connecting to server on localhost:19530, illegal connection params or server unavailable)>:
vector_db = Milvus.from_documents(
docs,
embeddings,
connection_args=milvus_conn
)
这让我摸不着头脑,中途我还换了ZILLIZ的连接方式。一样报错 pymilvus.exceptions.MilvusException: <MilvusException: (code=2, message=Fail connecting to server on localhost:19530, illegal connection params or server unavailable)>。
后来我才发现,其实报错的应该是
embeddings = OllamaEmbeddings(
model="shaw/dmeta-embedding-zh:latest",
base_url="http://192.168.3.3:11434"
)
在一开始,我并没有加上base_url这个参数,这个OllamaEmbeddings其实只构造了一个只有model名字的对象而已。 实际在Milvus调用的时候会找不到model报错,但是错误提示过于模糊,导致我认为是Milvus连接的问题。
至于 Win 请求地址无效 这个错误是因为我被第一个错误误导,不停地该milvus_conn的连接方式出现的。 Langchain框架连接Milvus似乎不支持socket模式,或者说是因为我不知道怎么用。 比如这段:
milvus_conn={'host': '192.168.3.14', 'port': 19530} # 错误, 正确的是 milvus_conn = {'uri': 'http://192.168.3.14:19530'}
vector_store.Milvus...
注意,上面是跑不通的,如果使用Langchain框架,必须要改成uri连接的方式(http://192.168.3.14:19530)才行。
Attu Docker部署
Attu很简单,但我还是踩了坑。
直接安装Attu:
docker run -itd --restart=always --name attu -p 8787:3000 -e HOST_URL=http://localhost:8787 -e MILVUS_URL=192.168.3.14:19530 zilliz/attu:latest
然后打开192.168.3.14:8787,填上 milvus的地址,果不其然----》 Network error 无法登录,刷新一次,确实也进去了,但只有个界面,没有对应数据,而且还在不停地报 Network error。 最后在Github评论里找到了解决方法。 还是版本的问题。 正确的安装命令:
docker run -itd --restart=always --name attu -p 8787:3000 -e MILVUS_URL=192.168.3.14:19530 zilliz/attu:v2.4
亲测可用:
至此,完成了。也许应该把应该踩的坑都踩了个遍了。 XC
更多推荐
所有评论(0)