
后面去的财神庙,结果抽签没赶上,抹黑下山。我很好奇大家都是从哪获取这些最新消息的,小某书搜索后点最新看看避雷贴?直接查公众号?但更多时候直接搜是搜不出来的,要到对应的文旅账号翻半天。所以我想做一个文旅助手,把真实景区文字描述、地理位置,开放时间,游玩的季节建议和门票等信息丢进去。

这样我跟朋友们出行的时候就可以不用单独拉个群了,提前一周丢了一大堆某书,然后出发当天所有人跟失忆一样,又开始问又重新搜无限循环。(硬生生把我一个J人被逼成P人了)OK,我脑子里过了一遍技术方案,头有点大。

要把这四五套系统捏合在一起的话,查询逻辑就得好几步,拿图片去向量库里比对,拿到ID,再去文本库搜描述,最后再用业务数据库里的价格和时间做过滤。性能方面我包它是拉的。遇事不决先看Github,说不定世界的某一处已经有大神跟我的想法一样,我就不需要重复造轮子了,然后发现了Langchain(老牌Agent构建框架)跟一个叫OceanBase seekdb的数据库合作了。

🔗langchain-course-oceanbase.netlify.app看了眼使用指南后,seekdb竟然支持在一张表里,同时存储和索引向量、文本、JSON、GIS这些乱七八糟的数据。而大多数其他数据库要么只擅长关系型事务,要么只擅长向量,要么只擅长全文,混合能力通常需要多系统拼装。
河南安阳的距离市中心50公里以内的,80分以上,适合春季旅行的人文景点

数据库自己会在底层把图片相似度、文本相关性、GIS空间关系和价格这些硬性指标一次性算好,然后直接把最精准的结果吐给我。<section data-clipboard-cangjie="["root",{},["p",{"uuid":"mjiad7oi48vkf4b0stp"},["span",{"data-type":"text"},["span",{"bold":false,"highlight":"rgb(255, 245, 184)","sz":12,"szUnit":"pt","color":"rgb(44, 44, 43)","data-type":"leaf"},"这里我想稍微解释一下混合搜索到底是在混什么,"]]],["p",{"uuid":"mjiad7oifounk7lffvs"},["span",{"data-type":"text"},["span",{"bold":false,"highlight":"rgb(255, 245, 184)","sz":12,"szUnit":"pt","color":"rgb(44, 44, 43)","data-type":"leaf"},"我这条需求里其实有四类信号,"],["span",{"bold":true,"highlight":"rgb(255, 245, 184)","sz":12,"szUnit":"pt","color":"rgb(44, 44, 43)","data-type":"leaf"},"这张照片“像不像”另一个景点(图像)"],["span",{"bold":true,"highlight":"rgb(255, 245, 184)","color":"rgb(44, 44, 43)","data-type":"leaf"},","],["span",{"bold":true,"highlight":"rgb(255, 245, 184)","sz":12,"szUnit":"pt","color":"rgb(44, 44, 43)","data-type":"leaf"},"描述里有没有“幽静、古朴”这类硬条件(全文检索/倒排),只要我周围 5 公里(GIS 距离/范围查询),票价 这里我想稍微解释一下混合搜索到底是在混什么,我这条需求里其实有四类信号,这张照片“像不像”另一个景点(图像),描述里有没有幽静古朴这类硬条件(全文检索+倒排),只要我周围 5 公里(GIS 距离+范围查询),票价<50、开放时间符合(关系型过滤)。难的是把这些信号合并成一次可控的检索执行,

最低1核CPU、2GB内存就能跑起来。在现在人均模型起手就要24GB的节点,我都有点不适应了。seekdb还能当MCP Server用,直接接入Cursor,Trae啥的。


还跟Dify打通了,可以直接做Dify的知识库。

那我就把这两天折腾的过程复盘一下。第一步,部署,非常简单,电脑有Docker环境,直接一行命令搞定了。
docker run -d --name seekdb -p 2881:2881 oceanbase/seekdb:latest
如果习惯用Python,那更简单,pip install pyseekdb就行了。接下来就是构建我想要的文旅小助手,我需要一个大模型的API key,把文本转成向量和后续问答。还需要一个地图服务的API key,用来处理地理位置,这里我用的是千问和高德。

数据集我用的是Kaggle上一个公开的352个中国城市景点数据。准备就绪后,就是三件套,克隆项目代码,安装依赖,把申请的API密钥和本地数据库的连接信息填进去。(这命令这八步是真压缩到没得再压了,直接看🔗也行)🔗www.oceanbase.ai/docs/zh-CN/build-multi-model-application-based-on-oceanbase/
# 1. 克隆项目
git clone https://github.com/oceanbase-devhub/ob-multi-model-search-demo.git
cd ob-multi-model-search-demo
# 2. 将kaggle上数据集解压到项目目录
mv ./archive.zip ./citydata.zip
unzip ./citydata.zip
# 3. 安装依赖
poetry install
# 4. 设置环境变量
vim .env
## 数据库连接串中的主机地址
OB_URL="******"
OB_USER="******"
OB_DB_NAME="******"
## 数据库连接串中的密码
OB_PWD="******"
# 5. 大模型 API Key
DASHSCOPE_API_KEY="******"
# 6. 高德地图 API Key
AMAP_API_KEY="******"
# 7. 自动导入数据
python ./obmms/data/attraction_data_preprocessor.py
# 8. 最后一步就是启动UI界面
poetry run streamlit run ./ui.py
当浏览器里弹出那个简洁的对话框时,我感觉这几天的折腾都值了。它能够理解我问题里那种模糊的的描述,然后通过向量搜索找到语义上相似的景点,再结合地理位置和一些我预设的偏好进行过滤。这在一年多以前,是很难想象的。有了多模态知识库和混合搜索,工程师拍下故障机器的照片,用语音描述刺耳的异响,系统就能瞬间从海量的维修手册,历史工单和实时传感器数据里,找出最可能的解决方案。你也可以上传在街上看到的衣服照片,然后说,我想要类似风格,但材质是纯棉的,价格在三百块以内的。系统不再是简单推荐一堆长得像的图片,而是真正理解了你所有维度的需求。到现在我还是有种想当然的荒谬的感觉,作为程序员,这些环节我已经习惯性分开处理了,但忘掉脑子凭直觉去想,多模态的数据不就是应该放在一个数据库里面吗?很合理吧!目前模型的前端都可以vibe出那么多效果了,再把数据库打通,我真的要说那句话了,AI时代,每个人都可以用五分钟做个自己的应用,到时候AI人奇妙夜是不是可以办起来了。
@ 作者 / 还在琢磨知识库的卡尔儿
