
RAG для закупок: Qdrant и LlamaIndex в локальном контуре
GoldenGekko 5 минут назад RAG для закупок: Qdrant и LlamaIndex в локальном контуре 15 мин 3 Python * Искусственный интеллект Машинное обучение * Natural Language Processing * Поисковые технологии * Привет Хабр! Меня...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
В сфере искусственного интеллекта произошло заметное событие. GoldenGekko 5 минут назад RAG для закупок: Qdrant и LlamaIndex в локальном контуре 15 мин 3 Python * Искусственный интеллект Машинное обучение * Natural Language Processing * Поисковые технологии * Привет Хабр! Меня зовут Владимир, и недавно я решил изучить новую (для себя) технологию - LlamaIndex. А тут и задачка подвернулась - надоело копаться в Положении о закупках, поэтому понадобился RAG для ответов по ФЗ-44, ФЗ-223, ну и локальному положению.
В этой статье разберу, как создать простенький RAG, не выходящий из локального контура, на базе LlamaIndex + Qdrant, напишем к нему API и UI на Gradio. Конфигурация проектаДля сервиса понадобятся LLM, векторная БД Qdrant, эмбеддер и реранкер результатов. Сразу код конфигурации:Код конфигурацииfrom pydantic import BaseModel, Field, SecretStr from pydantic_settings import BaseSettings, SettingsConfigDict class ServiceConfig(BaseModel): name: str = 'ProcurementRAG' host: str = '0.
Технические детали
0' port: Annotated = 8000 loglevel: str = 'INFO' log_to_file: bool = False trace_debug: bool = False enable_gui: bool = False class LLMConfig(BaseModel): host: str = 'localhost' port: Annotated = 11434 model_name: str = 'qwen3:14b' api_key: SecretStr = SecretStr('EMPTY temperature: Annotated = 0. 1 @property def url(self) -> str: if self. port is not None: return f' return f' class QdrantConfig(BaseModel): host: str = 'localhost' port: Annotated = 6333 collection: str = 'procurement_docs' @property def url(self) -> str: return f' class EmbeddingConfig(BaseModel): model_name: str = 'intfloat/multilingual-e5-base' dimension: Annotated = 768 class RerankConfig(BaseModel): enabled: bool = False model_name: str = 'cross-encoder/ms-marco-MiniLM-L-6-v2' top_n: Annotated = 5 class Settings(BaseSettings): service: ServiceConfig = Field(default_factory=ServiceConfig, validation_alias='RAG llm: LLMConfig = Field(default_factory=LLMConfig) qdrant: QdrantConfig = Field(default_factory=QdrantConfig) embedding: EmbeddingConfig = Field(default_factory=EmbeddingConfig) rerank: RerankConfig = Field(default_factory=RerankConfig) model_config = SettingsConfigDict( env_file=_ENV_FILE, env_file_encoding='utf-8', extra='ignore', case_sensitive=False, env_nested_delimiter='__', )Если кто-то читал меня до этого, то заметил, что конфиги я копирую из проекта в проект (естественно, меняя параметры).
Но на всякий случай в этой статье я рассмотрел, как это работает. Отличие от старого варианта в том, что теперь везде есть параметры по умолчанию, чтобы линтер не ругался. Эмбеддер и реранкер будут использоваться в пайплайне LlamaIndex, поэтому адреса им не нужны.
Индексация документовПеред тем, как добавлять документы в индекс Qdrant, их необходимо преобразовать в текст и нарезать на чанки.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





