1. Путаница пакетов и импортов
LangChain разбит на пакеты: ядро — langchain/langchain-core, интеграции — langchain-google-genai, загрузчики сообщества — langchain-community. Частая ошибка — импортировать загрузчик из ядра.
ImportError / ModuleNotFoundError. Решение: ставьте нужные пакеты и берите WebBaseLoader/PyPDFLoader из langchain_community.document_loaders.
2. Забытый или не подхваченный ключ
Без ключа модель и эмбеддинги не работают. Часть библиотек Google ждёт ключ именно в GOOGLE_API_KEY, а не в GEMINI_API_KEY.
if "GOOGLE_API_KEY" not in os.environ:
os.environ["GOOGLE_API_KEY"] = os.getenv("GEMINI_API_KEY")
3. Длинный документ без разбиения на чанки
Если эмбеддить весь документ целиком, поиск становится грубым, а в промпт LLM можно не уместить контекст. Разбивайте на фрагменты сплиттером (RecursiveCharacterTextSplitter) — поиск точнее.
4. Использование устаревшего LLMChain
Код из старых статей на LLMChain выдаёт предупреждения об устаревании. Используйте LCEL: chain = prompt | llm | StrOutputParser(). См. Старый vs Новый.
5. Несоответствие переменных шаблона и входа
Имя переменной в from_template("... {context} ...") должно совпадать с ключом в invoke({"context": ...}). Иначе — ошибка о недостающей/лишней переменной.
6. Доверять ответу как «факту из документа»
LLM может «додумать» ответ, даже если в найденных фрагментах его нет (галлюцинация). В промпте явно просите отвечать только по контексту и предусмотрите ответ «в документе нет информации».