Py学习  »  Git

详解Github 35K+项目:打通200+数据源,构建企业级AI的数据统一入口,支持MCP【下篇】

AI大模型应用实践 • 11 月前 • 211 次点击  



点击上方 蓝字关注我们




我们继续上篇(详解Github 35K+项目:打通200+数据源,构建企业级AI的数据统一入口,支持MCP【上篇】)来学习MindsDB这款开源的AI数据引擎。
图片
本篇内容:
  • 知识库与混合检索的应用
  • RAG与数据智能体(Agent)
  • 总结与MindsDB应用建议



01

知识库与混合检索的应用
上篇我们已经体验到MindsDB的两大集成能力:数据源(RDBMS、文件、向量库等)的集成与AI模型(传统ML模型、语言模型、嵌入模型等)的集成。其独特之处在于:让你用一种统一的SQL接口方式来查询所有的数据源与模型,并能够巧妙的融合
比如你可以:
  • 把数据表与LLM连接,输出批量推理结果(如生成文本字段的摘要)
  • 把数据表与嵌入模型连接,再与向量库连接,创建某字段的向量索引
这里的第二种场景中,如果把一个文件映射成“表”,然后通过一个SQL,就可以直接给这个文件创建向量索引。比如:
create table my_chromadb.collection_name
(
select m.embedding as embeddings,f.content,f.metadata
from files.table1 f join my_emb_openai m 
)
现在你可以查询这个向量库中的“表”实现语义检索、拓展应用(如RAG)。
尽管这个过程已经非常直观与友好,但是你仍然需要如下步骤:
  1. 映射数据源(DB或者文件):用来读取需要向量化的数据
  2. 创建向量库:用来存储向量与索引,提供语义检索
  3. 创建嵌入模型:用来生成输入数据的向量
  4. 创建向量索引:将必要的源数据向量化
  5. 语义检索:对向量数据库执行语义检索
  6. 重排序(可选):对检索的内容通过Rerank模型重排序
为了简化这样的场景,MindsDB推出一种更高级的特性:知识库(Knowledge Base)。

【什么是MindsDB的知识库】
简单的总结:
知识库就是融合嵌入模型、向量数据库、Rerank模型的能力,把上述多个数据组织步骤进一步简化的一种虚拟AI“表”。
原理示意如下:
下面通过具体的例子来演示其工作方式,并了解其背后的工作原理。

【准备数据源】
以之前导入的一个包含若干FAQ问答的Word文档为例,这文档已经被映射成一个文件数据源,通过SQL可检索:
select * from files.sales_questions

【创建知识库】
现在如果你想针对content(其实是源文件内容分割后的chunk)创建向量索引,就可以借助知识库(Knowledge Base)模块,首先创建一个知识库:
create KNOWLEDGE_BASE my_sales_question_kb
using
    content_columns = ['content'],
    preprocessing = {
        "text_chunking_config" : {
            "chunk_size"1000,
            "chunk_overlap"100
        }
    }
知识库可以指定的创建参数主要包括:
  • 模型:包括嵌入和Rerank模型,这里使用config.json中的默认模型
  • 向量库与数据源对应关系:这是用来指定向量数据库中的信息对应的数据源的列,包括id_column(标识唯一的向量)、metadata_columns(向量元数据的列,可以多列)、content_columns(需要生成向量的列,可以多列)
  • 预处理参数:用来指定对content列预处理的参数,典型的如需要分割成的chunk大小(chunk_size,默认500)等

【向知识库插入数据】
现在就可以直接向知识库中插入数据,无需指定列信息,MindsDB会自动根据知识库创建的参数映射:
insertinto my_sales_question_kb
select * from files.sales_questions
MindsDB会自动完成创建嵌入模型、创建向量库、利用嵌入模型生成向量、将向量与Metadata等保存到向量库这一系列动作。

【利用知识库做语义检索】
在知识库创建完成后,你可以不带任何条件的查看其数据:
select * from my_sales_question_kb
注意MindsDB知识库的结构是固定的,包括ID、chunk_id、chunk_content、metadata等列,这些数据正是根据你在创建时的参数从数据源生成:
当然这样的检索并无实际意义。知识库最大的价值是可以进行语义检索,比如:
select * from my_sales_question_kb
where content = '客户出一个超低价时怎么办?或者说:客户为什么会出"超低价"?'
relevance >=0.7 limit5
注意语义检索的字段必须是content。这里用SQL的方式完成了语义检索,相比其他的方式更直观与简单。
检索时除了带自然语言文本的条件外,还可以:
  • 使用limit来限制返回的数量(默认为10)
  • 使用relevance来限制语义相关度(或者distance)
  • 使用metadata中的列来做元数据过滤
    以下是典型的检索结果:

【交叉连接实现多源混合检索】
这也是我认为知识库最重要的价值。
由于MindsDB把知识库也当做了一种“表”,因此你也可以把它与其他数据源的做JOIN,从而实现更加复杂的向量+标量、结构化+非结构化的多条件混合检索场景。以之前在介绍OceanBase文章中提到的一个查询为例:
推荐几款操作流畅的受女生喜欢的手机,苹果或者华为的,价格低于1万。
如何在数据不离开RDBMS,而RDBMS自身又不支持向量的环境下做这个检索呢?或许借助MindsDB可以轻松实现。
首先你需要参考上面的过程,针对产品(假设存放在Postgres数据源中,表名为products)创建一个可用来语义检索的知识库,比如名称为my_kb,ID列为product_id,Content列为手机的文本介绍。
现在你可以执行这样的SQL来完成混合检索:
SELECT p.product_id,p.product_name,p.description
FROM my_kb as k join my_postgres.products as p 
on k.id = p.product_id
WHERE k.content = '操作要流畅,受女生欢迎的手机'and relevance >= 0.5and
p.brand in ( '苹果','华为'and p.price 10000
limit5
这里首先利用知识库my_kb在content上做语义匹配找到相关产品,然后通过k.id = p.productid关联回原始产品表p,进一步在SQL层面按品牌和价格进行了过滤。最终结果返回的就是同时满足语义条件和结构化条件的产品列表。
你甚至可以把两个知识库做JOIN,同时加入两个不同的语义检索条件。
这种混合查询相信在很多企业应用场景非常有用,因为传统应用的高价值信息大多在RDBMS,需要结合AI时代的非结构化文本处理,借助MindsDB这种数据“中间件”,实现既简单又直观。

【知识库自动更新】
由于知识库的背后有一个基于数据源创建的向量库,那么这个向量库与数据源之间如何同步呢?这也是很多新的“AI数据孤岛”常面临的麻烦。
在MindsDB中你可以借助JOB这个机制(CREATE JOB)来实现定期、自动化的同步处理。这种同步可以是:
  • 不同数据源之间的同步
  • 数据源与知识库的同步
  • 数据源与模型的同步(重新训练ML模型)
这种同步机制非常类似于Oracle的JOB或MySQL的Event Scheduler机制,借助于ID列,可以轻松让知识库根据数据源定期同步:
当然,如果你有更实时的同步需求,也可以考虑MindsDB的Trigger(触发器)机制,不过该机制存在数据库限制。



02

RAG与数据智能体(Data Agent)
知识库可以用来语义检索,那么就可以在此基础上快速构建一个RAG(Retrieval-Augmented Generation,检索增强生成)管道:
无非是把检索出的内容输入给LLM,由于LLM在MindsDB中也是一种可以查询的“表”,所以你可以用“表”连接来查询RAG答案:



    
select answer 
from (
SELECT '你是一个销售管理的专家。
请参考以下的上下文,适当的组织,回答销售提出的问题。
如果上下文无法解答,请表示歉意,不要编造。
直接给出答案,不要多余解释。使用Markdown格式。
'
+group_concat(chunk_content)+'
------------
销售的问题是:
'
 + '客户出一个"超低"价时怎么办?或者说:客户为什么会出"超低价"??'

as question
FROM `my_sales_question_kb`
WHERE content = '客户出一个"超低"价时怎么办?或者说:客户为什么会出"超低价"?'
limit 3) as prompt join my_llm_openai_answer
这是一个有趣的SQL RAG管道!执行后可以直接得到答案:
它包含了基础的语义检索、重新排序、相关性过滤、记录数限制,在召回若干chunk后,用group_concat函数合并;然后把它们组装成提示词,用“JOIN”的方式输入给LLM模型(把模型看做包含question和anser两列的“表”)。
尽管在一些高级RAG特性上可能还不够强大(比如多模态、融合检索),但在一些简单的需要“嵌入式RAG”管道的场景中,却是一种技能要求最低的方式。
不过这种方式仍然不够直观,在MindsDB的新版本中,提供了更加强大的 Data Agent(或者SQL Agent)模块。

【什么是MindsDB的Agent】
简单总结就是:
一个围绕特定数据集和模型、配置好技能的智能数据问答智能体。
通过指定Agent可以访问哪些表和知识库、使用哪个LLM模型来生成回答,以及一个提示模板来指导LLM回答,就可以完成一个Data Agent的创建。
定义好后,Agent就能接受自然语言问题输入,自动在授权的数据源中检索信息,然后由LLM综合给出答案 。
举个例子,假设想构建一个面向客服或销售的“产品咨询助手”。它可以访问产品库、客户和订单数据库,还能从产品描述知识库中获取语义信息,最终通过一个LLM生成答案。你可以这样配置 Agent:
CREATE AGENT my_agent
CONFIGURE
    engine = 'openai'
    model = 'gpt-4o'
    openai_api_key = ''
USING
    knowledge_bases = ['my_kb'], 
    tables = [
        'my_postgres.products',
        'my_postgres.customers',
        'my_postgres.orders',
        'my_postgres.order_items'
    ],
    prompt_template = '
        - 知识库 my_kb:包含产品描述的语义向量索引,可用于理解产品特性;
        - 表 my_postgres.products:产品的结构化信息(名称、品牌、价格等);
        - 表 my_postgres.customers:客户详细信息;
        - 表 my_postgres.orders 与 order_items:历史订单及明细。'

;
以上的SQL配置了一个Agent:
  • 使用OpenAI的gpt-4o作为语言模型
  • 用知识库my_kb以及四张Postgres表作为数据源
  • 提示模板用来告诉LLM数据源的作用
现在你可以通过SQL语句提出问题:
SELECT answer
FROM my_sales_question_agent 
WHERE question = '';
此外还可以在客户端通过SDK来调用;甚至通过A2A协议调用这个Agent。

【Agent原理】
MindsDB的Agent本质上是一个LangChain实现的服务端Agent,只是MindsDB自动完成了一些工作,包括工具的创建和提示词的设定等。内部架构如下:
当用户提出问题时,Agent会借助它的两大技能完成数据检索,获得参考的上下文,最后组织答案并输出。
两类技能是:
  • 知识库查询:对知识库执行语义检索,并返回相似的记录
  • 文本到 SQL:自然语言转SQL查询,从数据源检索数据
Agent是MindsDB在其核心能力(数据源与模型的集成与统一访问)上层提供的应用侧模块。在一些特定场景下,比如客服自动化、即席数据查询、简单决策分析等,可以借助它来简化工作量。
个人测试结果看,MindsDB Agent目前还不够完善,不适合在严格商业环境下的使用,Text2SQL、知识库工具出错概率较大(也和模型有一定关系)。


03

总结与应用建议
至此我们已经把MindsDB的主要能力做了介绍。
MindsDB近期还支持了A2A以及MCP协议。这意味着可以将MindsDB中的融合数据查询、Agent等能力无缝集成到更大的智能体系统中,为企业构建复杂AI应用提供了极大的灵活性。
【应用建议】
作为一款开源产品,MindsDB是一个强大的企业数据层的智能“中间件”,它以“数据不出库,AI进库来”的模式,帮助解决企业AI应用落地中的数据环境复杂、遗留系统多、数据融合困难等难题。
你可以:
  • 无需搬移数据就能跨源的数据访问,避免重复存储和时滞
  • 无需复杂开发就能使用各种AI模型,用SQL降低了AI门槛
  • 一种基于SQL扩展的融合数据访问方式,学习成本非常低
  • 知识库帮助简化非结构化知识的自动组织、索引与检索
  • JOB、触发器等机制帮助实现自动数据同步与模型训练
  • 丰富的客户端开发接口,支持SDK、REST、MCP/A2A等
整体上,对于MindsDB的应用建议为:
适合作为复杂企业环境中(比如多异构数据源或遗留系统)的“虚拟AI数据底座”,对上层应用提供融合与智能的统一数据访问接口。特别是希望以最低的学习成本,在传统企业技术栈的基础上引入与集成AI能力,可以考虑灵活应用。

图片

END

推荐学习本公众号最新出版的作品

📘《MCP原理揭秘与开发指南——构建可扩展的AI智能体》

详情点击下方链接


识别以下名片

加入公众号交流群(说明来意)
图片

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/187301