
PandasAI LanceDB 向量存储扩展为 Agent 训练与 RAG 检索提供持久化向量能力【免费下载链接】pandas-aiChat with your database or your datalake (SQL, CSV, parquet). PandasAI makes data analysis conversational using LLMs and RAG.项目地址: https://gitcode.com/GitHub_Trending/pa/pandas-ai本文面向需要在 PandasAI 中使用向量数据库为 Agent 提供训练记忆的开发者。通过 pandasai-lancedb 扩展你可以将问题-代码对QA与业务文档持久化到本地 LanceDB并在对话时按语义相似度检索作为上下文喂给大模型。读完本文你将掌握该扩展的安装方式、LanceDB类的全部核心 API、默认/自定义嵌入模型的选择以及它如何与Agent.train()无缝衔接形成完整的 RAG 闭环。PandasAI 通过VectorStore抽象层pandasai/vectorstores/vectorstore.py为 Agent 提供训练数据的存取能力把历史问答自然语言问题 对应生成的 Python 代码和补充文档向量化后持久化在后续会话中按语义相似度召回作为上下文注入提示词。pandasai-lancedb正是该抽象层基于 LanceDB 的官方实现无需额外部署服务端数据以本地文件形式持久化开箱即用。一、扩展概览与安装1.1 它解决什么问题该扩展将 LanceDB 与 PandasAI 集成提供面向增强数据分析与机器学习任务的向量存储能力见 README.md。从源码结构看它通过LanceDB类实现 VectorStore 抽象基类定义的整套接口包括问题-代码对的增删改查与语义检索add_question_answer/update_question_answer/delete_question_and_answers/get_relevant_question_answers文档的增删改查与语义检索add_docs/update_docs/delete_docs/get_relevant_docs按 ID 精确获取记录、按相似度距离阈值过滤结果等进阶能力。1.2 安装方式官方 README 推荐的安装方式是通过 Poetrypoetry add pandasai-lancedb对应包元信息见 pyproject.toml核心依赖与版本约束如下依赖项版本约束说明python3.8,3.12注意不支持 Python 3.12pandasai3.0.0b4依赖主框架的VectorStore抽象接口lancedb^0.5.0LanceDB 客户端库numpy1.23.2锁定版本sentence-transformers^2.2.2默认嵌入模型加载器测试依赖可选分组test包含pytest ^7.4.0、pytest-cov、pytest-mock用于运行 test_lancedb.py 中的单元测试。提示该包位于extensions/ee/目录下属于 Enterprise企业版扩展。包的 LICENSE 文件LICENSE声明为 Sinaptik GmbH Enterprise License商业使用需联系pmsinaptik.ai见 README.md。二、核心类LanceDB与构造参数详解扩展的唯一对外入口是LanceDB类由 pandasai_lancedb/init.py 导出实现位于 pandasai_lancedb/lancedb.py。2.1 构造参数from pandasai_lancedb import LanceDB vector_store LanceDB( table_namepandasai, # 表名前缀默认 pandasai embedding_functionNone, # 自定义嵌入函数默认 None persist_path/tmp/lancedb, # 数据持久化目录默认 /tmp/lancedb max_samples1, # 检索返回的最大样本数默认 1 similary_threshold1.5, # 相似度距离阈值默认 1.5 loggerNone, # 日志器默认创建新 Logger )参数默认值作用与注意点table_namepandasai实际会创建两张表{table_name}-qa与{table_name}-docsembedding_functionNone自定义嵌入函数签名Callable[[List[str]], List[float]]为None时使用默认嵌入模型persist_path/tmp/lancedbLanceDB 数据持久化目录lancedb.connect()直接连接该路径max_samples1检索时的默认 top-k 数量similary_threshold1.5距离阈值_distance threshold的结果才会被保留loggerNone传入pandasai.helpers.logger.Logger实例用于日志输出注意源码中该参数名为similary_threshold保留原始拼写这是当前仓库的实际 API 签名使用时请照此书写。2.2 初始化流程源码级解读构造时LanceDB会依次完成以下步骤见 lancedb.py调用lancedb.connect(persist_path)连接必要时创建本地数据库根据是否传入embedding_function构造Schema并创建两张 LanceDB 表表已存在则open_table打开不存在则create_table保证重复初始化不丢数据通过 Logger 输出持久化路径与初始化成功的日志。从源码可以推断Schema类同文件 lancedb.py会定义两个继承自lancedb.pydantic.LanceModel的模型QA_pairs字段为idstr、qa嵌入源字段SourceField、metadatastr、vectorVector(ndims)向量字段Docs字段为id、doc嵌入源字段、metadata、vector。两者共享同一个嵌入函数向量的维度由嵌入模型动态计算ndims()会先对[foo]生成一次嵌入以确定维度。三、嵌入模型默认模型与自定义函数3.1 默认嵌入方案当embedding_functionNone时Schema使用 LanceDB 注册表中的sentence-transformers嵌入函数get_registry().get(sentence-transformers).create( nameBAAI/bge-small-en-v1.5, devicecpu )即默认使用BAAI/bge-small-en-v1.5模型并在 CPU 上推理见 lancedb.py。该默认行为意味着首次使用时需要下载模型权重。另外get_embeddings()方法中单独使用了BAAI/bge-large-zh-v1.5见 lancedb.py说明该实现同时关注中英文语义场景从源码结构看它主要用于直接获取文本向量的辅助场景。3.2 自定义嵌入函数若希望使用自有嵌入模型可在构造时传入一个可调用对象例如from sentence_transformers import SentenceTransformer model SentenceTransformer(BAAI/bge-small-en-v1.5) def embed(texts): return model.encode(texts, normalize_embeddingsTrue).tolist() vector_store LanceDB(embedding_functionembed)传入后Schema会通过EmbeddingFunctionRegistry.get_instance(model)注册并创建名为embedding_function的嵌入器见 lancedb.py。同时所有写入add_*与检索get_relevant_*路径都会改为调用你的函数生成向量见 lancedb.py保证写入与查询使用同一套向量空间。四、数据写入QA 对与文档的持久化4.1 写入 QA 对ids vector_store.add_question_answer( queries[What is LanceDB?, How does it work?], codes[print(Hello), for i in range(10): print(i)], # ids[custom_id_1, custom_id_2], # 可选默认自动生成 UUID # metadatas[{source: docs}, ...], # 可选元数据 )实现要点见 lancedb.pyqueries与codes长度不一致时会抛出ValueError并提示维度不匹配未传入ids时自动生成形如{uuid4}-qa的 ID未传入metadatas时统一填充字符串None每条记录按Q: {query}\n A: {code}的格式拼接为qa字段格式定义在 VectorStore._format_qa有自定义嵌入函数时预先计算vector列一并写入否则交由 LanceDB 的嵌入源字段在写入时自动生成。4.2 写入文档ids vector_store.add_docs( docs[Document 1, Document 2], # ids[doc_id_1, doc_id_2], # 可选 # metadatas[{topic: intro}, ...], # 可选 )逻辑与 QA 写入对称ID 默认形如{uuid4}-docs元数据默认None有自定义嵌入函数时预计算向量见 lancedb.py。4.3 更新与删除update_question_answer(ids, queries, codes, metadatas)按id {id}条件对qa表执行 LanceDB 行更新同样会校验 queries/codes 长度一致见 lancedb.pyupdate_docs(ids, docs, metadatas)按 ID 更新doc与metadata字段见 lancedb.pydelete_question_and_answers(ids)/delete_docs(ids)按 ID 逐条执行table.delete(fid {id})成功返回True见 lancedb.py。五、语义检索距离阈值与 Top-K检索是本扩展服务于 RAG 的核心能力# 检索与问题最相关的 QA 对 results vector_store.get_relevant_question_answers(What is LanceDB?, k2) # 检索相关文档 doc_results vector_store.get_relevant_docs(How does it work?, k3)两者的返回结构一致见 lancedb.py{ documents: [[Q: What is LanceDB?\n A: print(Hello), ...]], metadatas: [[None, ...]], }实现要点k未指定时使用构造参数max_samples默认嵌入模式下直接以问题文本调用table.search(queryquestion)自定义嵌入模式下先用embedding_function([question])生成查询向量再搜索结果经过_filter_docs_based_on_distance过滤仅保留_distance similary_threshold默认 1.5的记录再拆分为documents与metadatas两个列表与VectorStore接口约定的返回格式对齐。此外还提供了按 ID 精确获取的方法get_relevant_question_answers_by_id(ids)与get_relevant_docs_by_id(ids)通过.where(fid {id})过滤并仅选择metadata与正文列见 lancedb.py。六、与 Agent 的集成train() 训练闭环该扩展真正的使用场景是配合 PandasAI Agent 的train()方法。在 pandasai/agent/base.py 中train()的逻辑如下若 Agent 未配置vectorstore抛出MissingVectorStoreError若只传了queries或codes之一抛出ValueErrordocs非空时调用vectorstore.add_docs(docs)queries与codes同时提供时调用vectorstore.add_question_answer(queries, codes)。组合使用示例from pandasai import Agent from pandasai_lancedb import LanceDB vector_store LanceDB( table_namemy_agent, persist_path/data/lancedb, ) agent Agent(dataframes, vectorstorevector_store) # 训练注入历史问答与补充文档 agent.train( queries[What is LanceDB?, How to filter a dataframe?], codes[print(Hello), df[df[col] 0]], docs[This is a supplementary document about the dataset.], )训练完成后对话阶段 Agent 会从向量库召回相关知识并注入提示词上下文仓库中 vectordb_docs.tmpl 即用于承载这部分召回内容可从其命名与位置推断其用途。七、单元测试与验证扩展自带完整单元测试test_lancedb.py可验证上述全部行为构造默认参数与自定义 Logger自动创建pandasai-qa/pandasai-docs两张表表不存在时创建add_question_answer/add_docs支持自动 ID 与自定义 ID输入维度不匹配时抛出ValueErrorupdate_question_answer/delete_question_and_answers/delete_docs的基本行为get_relevant_question_answers/get_relevant_docs的返回结构与按 ID 查询。测试在tearDown中清理/tmp/lancedb目录因此可以在本机直接运行pytest extensions/ee/vectorstores/lancedb/tests/test_lancedb.py八、与其他向量存储扩展的关系本扩展并非 PandasAI 唯一的 VectorStore 实现。在 extensions/ee/vectorstores 目录下还提供了 ChromaDBpandasai_chromadb、Milvuspandasai_milvus、Pineconepandasai_pinecone与 Qdrantpandasai_qdrant等多个扩展它们都实现同一套 VectorStore 接口。选择 LanceDB 的典型优势在于无需部署独立的向量数据库服务数据以本地文件持久化通过persist_path即可复用已有训练数据适合单机与开发环境。九、许可证与使用边界最后提醒pandasai-lancedb采用Sinaptik GmbH Enterprise License详见 LICENSE 与 README.md商业场景使用需联系pmsinaptik.ai获取授权。技术评估与原型验证可参考本文内容正式商用前请务必确认授权条款。【免费下载链接】pandas-aiChat with your database or your datalake (SQL, CSV, parquet). PandasAI makes data analysis conversational using LLMs and RAG.项目地址: https://gitcode.com/GitHub_Trending/pa/pandas-ai创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考