Перейти к содержанию

Подсистема Retrieval

Платформа использует подсистему retrieval для извлечения и ранжирования информации из внешних источников и локальных хранилищ. Ниже описаны её основные компоненты.

Основные компоненты

Web-поиск (retrieval/web/*)

Каталог retrieval/web содержит интеграции с различными поисковыми провайдерами (Google, Bing, DuckDuckGo и др.). Каждый модуль реализует функцию search_<провайдер>(api_key, query, count, filter_list=None) и возвращает список объектов SearchResult, определённый в main.py. Эти функции обращаются к внешним HTTP‑API и приводят ответ к общему формату.

Векторные базы (retrieval/vector)

Здесь находятся обёртки для различных векторных баз данных: Qdrant, Pinecone, Milvus, Elasticsearch и др. В каталоге dbs/ лежат клиенты для каждой БД, а файл factory.py выбирает подходящую реализацию на основе настройки VECTOR_DB. Все клиенты наследуются от VectorDBBase из main.py и предоставляют единый интерфейс для операций с эмбеддингами.

Модели ранжирования (retrieval/models)

Каталог содержит модели, переупорядочивающие результаты поиска. Базовый класс BaseReranker задаёт метод predict, принимающий пары "запрос-документ" и возвращающий список оценок релевантности. Примеры реализаций — ColBERT и External.

Примеры расширения

Добавление нового загрузчика документов

  1. Создайте файл в retrieval/loaders, например my_loader.py, и реализуйте метод load:

```python from langchain_core.documents import Document

class MyLoader: def init(self, file_path: str): self.file_path = file_path

   def load(self) -> list[Document]:
       text = open(self.file_path).read()
       return [Document(page_content=text)]

```

  1. В retrieval/loaders/main.py добавьте логику, возвращающую MyLoader для нужного расширения файла или значения engine.

Добавление нового поискового провайдера

  1. В каталоге retrieval/web создайте модуль, например mysearch.py:

```python import requests from corpai_platform.retrieval.web.main import SearchResult

def search_mysearch(api_key: str, query: str, count: int, filter_list=None) -> list[SearchResult]: resp = requests.get( "https://api.mysearch.example/search", params={"q": query, "key": api_key}, ) data = resp.json()["results"] return [ SearchResult(link=i["url"], title=i.get("title"), snippet=i.get("snippet")) for i in data[:count] ] ```

  1. Используйте функцию search_mysearch в месте, где производится web‑поиск, передав необходимые параметры API.