使用 embs 提升您的语义搜索能力

社区文章 发布于 2025 年 1 月 27 日

在一个数据呈指数级增长的时代,高效检索和排序相关信息的能力变得至关重要。无论是构建**语义搜索引擎**还是实现**上下文感知聊天机器人**,拥有一个强大的文档处理管道都是必不可少的。这正是 **embs** 的用武之地。

embs 是一个轻量级的 Python 工具包,旨在简化**检索、分割、嵌入和排序文本**的工作流程。它由**免费 API** 提供支持——用于文档转换的 Docsifer 和用于嵌入的 Lightweight Embeddings API——让您以最少的配置获得卓越的结果。

用例:使用自定义模型进行语义搜索

想象一下构建一个**语义搜索引擎**来查询大型文档,如 PDF 或网页。为了获得最佳结果,您可能需要**分割**、使用自定义模型进行**嵌入**以及按相关性**排序**——所有这些都可通过 **embs** 轻松实现。

支持的嵌入模型

embs 通过 Lightweight Embeddings API 支持以下最先进的文本嵌入模型:

  • `snowflake-arctic-embed-l-v2.0`:针对语义相似性任务优化的通用多语言模型。
  • `bge-m3`:用于大规模语义搜索的强大模型。
  • `gte-multilingual-base`:专为多语言理解设计。
  • `paraphrase-multilingual-MiniLM-L12-v2`:轻量级、快速,非常适合释义检测。
  • `paraphrase-multilingual-mpnet-base-v2`:非常适用于多语言文本相似性任务。
  • `multilingual-e5-small`、`multilingual-e5-base`、`multilingual-e5-large`:用于语义相似性的高质量嵌入,提供多种尺寸以平衡速度和准确性。

示例:使用模型选择搜索文档

以下是如何使用 embs 检索、分割、嵌入和排序文档,同时指定自定义嵌入模型的方法。

from functools import partial
from embs import Embs

async def main():
    # Configure the Markdown splitter
    split_config = {
        "headers_to_split_on": [("#", "h1"), ("##", "h2")],  # Split by Markdown headers
        "return_each_line": False,  # Group content under each header
        "strip_headers": True       # Remove headers from chunks
    }
    md_splitter = partial(Embs.markdown_splitter, config=split_config)

    # Initialize the Embs client
    client = Embs()

    # Step 1: Retrieve documents from a file and a URL, with splitting
    docs = await client.retrieve_documents_async(
        files=["/path/to/sample.pdf"],
        urls=["https://example.com"],
        splitter=md_splitter  # Optional splitter for better granularity
    )
    print(f"Total chunks after splitting: {len(docs)}")

    # Step 2: Rank the document chunks by a query, specifying a custom model
    query = "What is quantum computing?"
    ranked_chunks = await client.search_documents_async(
        query=query,
        files=["/path/to/sample.pdf"],
        urls=["https://example.com"],
        splitter=md_splitter,               # Use the splitter
        model="multilingual-e5-base"        # Specify the embedding model
    )

    # Step 3: Print the top results
    for chunk in ranked_chunks[:3]:
        print(f"File: {chunk['filename']} | Score: {chunk['probability']:.4f}")
        print(f"Snippet: {chunk['markdown'][:100]}...")

解释:为什么自定义模型很重要?

不同的用例需要不同的嵌入模型:

  • `snowflake-arctic-embed-l-v2.0` 是一个强大的通用多语言模型。
  • `bge-m3` 在大规模文档搜索方面表现出色,使其成为企业搜索引擎的理想选择。
  • `multilingual-e5-large` 为复杂的语义任务提供高准确性,但对于轻量级需求,**`e5-small`** 或 **`e5-base`** 可能更好。
  • `paraphrase-multilingual-*` 模型非常适用于聊天机器人问答或释义检测等任务。

通过明确选择模型,您可以针对精度、速度或多语言能力对您的管道进行微调。

辅助函数和功能

Markdown 分割 (markdown_splitter)

`markdown_splitter` 函数可以轻松地根据 Markdown 标题将大型文档分解为可管理的小块。这对于提高搜索工作流程中的相关性至关重要。

示例:

split_config = {
    "headers_to_split_on": [("#", "h1"), ("##", "h2")],
    "strip_headers": True,
    "return_each_line": False
}
md_splitter = partial(Embs.markdown_splitter, config=split_config)

为什么分割文档?

  • 通过关注更小、更有意义的部分来提高相关性。
  • 与嵌入结合使用时,可实现更好的排名。

使用自定义模型嵌入文本

`embed` 方法为任何文本或文本列表生成嵌入。您可以指定一个受支持的模型,以与您的特定用例保持一致。

示例:

client = Embs()
embedding = client.embed(
    text_or_texts="What is quantum computing?",
    model="paraphrase-multilingual-mpnet-base-v2"
)
print(embedding)

缓存以实现可伸缩性

启用缓存以高效处理大规模检索工作负载。使用**内存缓存**进行快速查找,或使用**磁盘缓存**进行持久存储。

示例:

cache_config = {
    "enabled": True,
    "type": "memory",        # Memory-based LRU caching
    "max_mem_items": 100,    # Cache up to 100 items
    "max_ttl_seconds": 3600  # Expire items after 1 hour
}
client = Embs(cache_config=cache_config)

为什么使用 embs 进行语义搜索?

  1. 最先进的模型:支持多语言和特定任务嵌入,实现跨不同用例的精确性。
  2. 统一工作流程:检索、分割、嵌入和排序——全部在一个 API 中完成。
  3. 免费 API 访问:Docsifer 和 Lightweight Embeddings 均可免费使用,从而降低了基础设施成本。
  4. 可定制:轻松切换模型或添加分割器,以优化特定需求的性能。

立即开始

安装 embs

pip install embs

这是一个快速入门代码片段,让您了解它的实际作用:

from embs import Embs

client = Embs()
results = client.search_documents(
    query="What is quantum computing?",
    files=["/path/to/quantum.pdf"],
    model="multilingual-e5-base"  # Specify the embedding model
)

for doc in results[:3]:
    print(f"{doc['filename']} | {doc['probability']:.4f} | {doc['markdown'][:80]}...")

🌟 立即使用 embs 构建更智能的语义搜索和 RAG 系统! 🚀

社区

注册登录 发表评论