使用 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 进行语义搜索?
- 最先进的模型:支持多语言和特定任务嵌入,实现跨不同用例的精确性。
- 统一工作流程:检索、分割、嵌入和排序——全部在一个 API 中完成。
- 免费 API 访问:Docsifer 和 Lightweight Embeddings 均可免费使用,从而降低了基础设施成本。
- 可定制:轻松切换模型或添加分割器,以优化特定需求的性能。
立即开始
安装 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 系统! 🚀