Подсистема 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.
Примеры расширения
Добавление нового загрузчика документов
- Создайте файл в
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)]
```
- В
retrieval/loaders/main.pyдобавьте логику, возвращающуюMyLoaderдля нужного расширения файла или значенияengine.
Добавление нового поискового провайдера
- В каталоге
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] ] ```
- Используйте функцию
search_mysearchв месте, где производится web‑поиск, передав необходимые параметры API.