AI Search 高效构建 RAG 服务
更新时间:2025-02-25
概述
向量数据库目前主要应用于 RAG 场景。在 RAG 的应用中,除了向量数据库,还需要文档管理、文档解析、分档分块、Embedding 服务(将内容向量化)、Rerank,以及 LLM 大模型等多个服务的相互协作,共同实现完整的 RAG 功能。基于这一需求,我们对各模块服务进行了封装,提供了对应的接口,方便用户自定义各模块,并与向量数据库高效结合,快速构建属于自己的 RAG 服务。
准备工作
环境准备
- 运行环境
- Python SDK工具包支持在Python 3.7及以上的环境运行。
源码下载
若您需要Python SDK源码,可从如下两处下载:
- Github地址:https://github.com/baidu/pymochow
- Gitee地址:https://gitee.com/baidu/pymochow
安装和卸载
我们推荐通过pip来安装和卸载Python SDK,方法如下:
安装
您可以在命令行执行如下命令完成Python SDK的安装:
Shell
1pip install pymochow
卸载
您可以在命令行中执行如下命令完成Python SDK的卸载:
Shell
1pip uninstall pymochow
将文档导入向量数据库
Python
1import logging
2import uuid
3from pymochow.ai.dochub import (
4 LocalDocumentHub,
5 DocumentHubEnv
6)
7from pymochow.model.document import Document
8from pymochow.ai.processor import QianfanDocProcessor
9from pymochow.ai.embedder import QianfanEmbedder
10from pymochow.ai.pipeline import DefaultPipeline
11
12env = DocumentHubEnv(root_path="local://your_root_path/")
13doc_hub = LocalDocumentHub(env=env)
14kb_id = str(uuid.uuid4())
15doc = Document(
16 kb_id=kb_id, # 知识库ID
17 doc_name="test/test.pdf", # 文档名,指期望文档存储在文档管理中的相对路径,举例:test/test.pdf
18 file_path="./test.pdf" # 文档的本地路径
19)
20
21# 将文件纳入到文档管理中,将文件./test.pdf复制到/root_path/test/test.pdf
22doc_hub.add(doc=doc)
23
24os.environ["APPBUILDER_TOKEN"] = "your_ab_token" # 需要填入您AppBuilder的token,会调用AppBuilder的服务进行文档处理和Embedding
25doc_processor = QianfanDocProcessor(maximum_page_length=300, page_overlap_length=50)
26embedder = QianfanEmbedder(batch=2)
27pipeline = DefaultPipeline()
28
29# 需要在向量数据库中创建对应的库和表,用于存储文档的元数据以及文档块内容
30db_name = "DocumentInsight" # 向量数据库的库名
31meta_table_name = "KnowledgeBase_Meta" # 存储文档元数据的表
32chunk_table_name = "KnowledgeBase_Chunk" # 存储文档块的表
33# 向量数据库中创建对应表
34meta_table = self.create_or_get_meta_table(db_name=db_name, table_name=meta_table_name)
35chunk_table = self.create_or_get_chunk_table(db_name=db_name, table_name=chunk_table_name)
36
37# 将文档解析、Embedding后存储到向量数据库
38pipeline.ingest_doc(
39 doc=doc,
40 doc_processor=doc_processor,
41 embedder=embedder,
42 meta_table=meta_table,
43 chunk_table=chunk_table
44)
对知识库进行向量检索
Python
1from pymochow.ai.embedder import QianfanEmbedder
2from pymochow.ai.pipeline import DefaultPipeline
3from pymochow.model.table import (
4 VectorTopkSearchRequest
5)
6
7os.environ["APPBUILDER_TOKEN"] = "your ab token"
8# embedder 用于对问题进行向量化
9embedder = QianfanEmbedder(batch=2)
10pipeline = DefaultPipeline()
11
12db_name = "DocumentInsight"
13chunk_table_name = "KnowledgeBase_Chunk"
14chunk_table = self.create_or_get_chunk_table(db_name=db_name, table_name=chunk_table_name)
15
16search_contents = ["your question"]
17search_request = VectorTopkSearchRequest(
18 vector_field="embedding",
19 limit=10,
20 #filter="kb_id='xxx'", 填入标量过滤条件
21 config=VectorSearchConfig(ef=200)
22)
23
24result = pipeline.vector_search(
25 search_contents=search_contents,
26 embedder=embedder,
27 table=chunk_table,
28 search_request=search_request
29)
对知识库进行全文检索
Python
1from pymochow.ai.pipeline import DefaultPipeline
2from pymochow.model.table import (
3 BM25SearchRequest
4)
5
6pipeline = DefaultPipeline()
7
8db_name = "DocumentInsight"
9chunk_table_name = "KnowledgeBase_Chunk"
10chunk_table = self.create_or_get_chunk_table(db_name=db_name, table_name=chunk_table_name)
11
12search_request = BM25SearchRequest(
13 index_name="content_inverted_idx",
14 search_text="bm25 search text",
15 limit=10,
16 #filter="kb_id='xxx'"
17)
18
19result = pipeline.bm25_search(
20 table=chunk_table,
21 search_request=search_request
22)
对知识库进行混合检索
Python
1from pymochow.ai.embedder import QianfanEmbedder
2from pymochow.ai.pipeline import DefaultPipeline
3from pymochow.model.table import (
4 VectorTopkSearchRequest,
5 BM25SearchRequest,
6 HybridSearchRequest
7)
8
9os.environ["APPBUILDER_TOKEN"] = "your ab token"
10# embedder 用于对问题进行向量化
11embedder = QianfanEmbedder(batch=2)
12pipeline = DefaultPipeline()
13
14db_name = "DocumentInsight"
15chunk_table_name = "KnowledgeBase_Chunk"
16chunk_table = self.create_or_get_chunk_table(db_name=db_name, table_name=chunk_table_name)
17
18search_contents = ["your question"] # 向量检索的内容
19vector_search_request = VectorTopkSearchRequest(
20 vector_field="embedding",
21 limit=10,
22 config=VectorSearchConfig(ef=200)
23)
24
25bm25_search_request = BM25SearchRequest(
26 index_name="content_inverted_idx",
27 search_text="bm25 search text" # 全文检索的内容
28)
29
30search_request = HybridSearchRequest(
31 vector_request=vector_search_request,
32 vector_weight=0.4, # 向量检索比重
33 bm25_request=bm25_search_request,
34 bm25_weight=0.6, # 全文检索比重
35 #filter="kd_id='xxx'", 填入标量过滤条件
36 limit=15
37)
38
39result = pipeline.hybrid_search(
40 search_contents=search_contents,
41 embedder=embedder,
42 table=chunk_table,
43 search_request=search_request
44)