Сравнение 1: LLMChain (устаревший) vs LCEL
В старых руководствах цепочку собирали классом LLMChain. В современном LangChain (0.2+) он помечен deprecated — цепочки строят оператором | (LCEL).
🟡 Из лекций прошлого (LLMChain)
from langchain.chains import LLMChain
chain = LLMChain(llm=llm, prompt=prompt)
result = chain.run(text="...")
# LLMChain помечен deprecated;
# .run() возвращает «сырой» формат
🟢 Современный LCEL
from langchain_core.output_parsers import StrOutputParser
chain = prompt | llm | StrOutputParser()
result = chain.invoke({"text": "..."})
# единый интерфейс Runnable:
# invoke / batch / stream «из коробки»
Сравнение 2: ручная оркестрация vs цепочки LangChain
🟡 Вручную (как в уроках 03–04)
text = load_page(url) # сам качаю
chunks = split(text) # сам режу
embs = [embed(c) for c in chunks]# сам считаю
idx = faiss_index(embs) # сам индексирую
ctx = search(idx, question) # сам ищу
ans = call_llm(prompt(ctx, q)) # сам собираю промпт
Полный контроль, но много «клея» и шаблонного кода.
🟢 Через LangChain
docs = WebBaseLoader(url).load()
store = InMemoryVectorStore.from_documents(
docs, embeddings)
found = store.similarity_search(question, k=3)
chain = prompt | llm | StrOutputParser()
ans = chain.invoke({"context": found, "question": q})
Готовые блоки: загрузка, эмбеддинги, поиск, цепочка — собираются как LEGO.
Сравнение 3: промпты в коде vs PromptHub
🟡 Промпт «зашит» в коде
prompt = "Суммаризируй: {text}"
# правки теряются в истории git кода;
# нет версий промпта отдельно;
# команда не видит, какой промпт «рабочий»
🟢 Промпт в PromptHub
# промпт хранится и версионируется отдельно
# v1 -> v2 -> v3, сравнение и откат
# команда правит и обсуждает совместно
# приложение тянет нужную версию промпта
⚠️ Конкретный способ загрузки промпта из PromptHub/аналога зависит от платформы и SDK (например, у LangChain есть свой Prompt Hub через
langchainhub). Сверяйтесь с документацией выбранной платформы.