Промптинг в LangChain
Недавний взрывной рост LLMs вывел на сцену новый набор инструментов и приложений. Один из этих новых мощных инструментов — фреймворк для LLM под названием LangChain. LangChain — это фреймворк с открытым исходным кодом, который предоставляет примеры шаблонов промптов, различные методы промптинга, сохранение контекста диалога и подключение к внешним инструментам.
LangChain имеет множество функций, включая различные методы промптинга, сохранение контекста диалога и подключение к внешним инструментам. Промптинг — одна из самых популярных и важных задач сегодня при создании приложений на основе LLM. Давайте подробно рассмотрим, как использовать LangChain для более сложных промптов.
В этой статье мы рассмотрим:
Простые промпты в LangChain
Промпты с несколькими вопросами
Few Shot Learning с LangChain
Ограничение токенов в ваших промптах LangChain
Краткое резюме промптинга в LangChain
Простые промпты в LangChain
Прежде чем перейти к коду, нам нужно скачать необходимые библиотеки. Нам нужно выполнить pip install langchain openai python-dotenv. Мы используем библиотеки openai и dotenv для управления нашим API-ключом OpenAI, чтобы получить доступ к GPT.
import os
from dotenv import load_dotenv
import openai
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
После того как у нас есть все предварительные условия, давайте начнем с основ — одного промпта. Один промпт — это то, как вы взаимодействовали бы с ChatGPT на сайте OpenAI. Один промпт не был бы сильным применением LangChain в продакшене, но важно понять, как работает промптинг в LangChain.
Мы используем объект PromptTemplate для создания промпта. Определить строку шаблона просто; мы используем тот же синтаксис, что и у f-строк, и вставляем переменные с помощью фигурных скобок. Мы определяем промпт, передавая строку шаблона и соответствующие имена переменных. Затем мы можем просто ввести наш вопрос. В этом разделе мы используем только один вопрос; в следующем разделе мы увидим, как делать промпты с несколькими вопросами.
Помимо промпта с вопросом, нам нужно добавить используемую LLM. В этом примере мы используем text-davinci-003 от OpenAI. Затем мы создаем LLMChain с контекстом шаблона промпта и LLM. Мы run вопрос через LLMChain, чтобы получить ответ.
from langchain import PromptTemplate
from langchain import LLMChain
template = """Question: {question}
Answer: """
prompt = PromptTemplate(
template=template,
input_variables=["question"]
)
user_question = "Which NFL team won the SuperBowl in 2010?"
from langchain.llms import OpenAI
davinci = OpenAI(model_name="text-davinci-003")
llm_chain = LLMChain(
prompt=prompt,
llm=davinci
)
print(llm_chain.run(user_question))
Промпты с несколькими вопросами
Отвечать на одиночные вопросы скучно, поэтому давайте рассмотрим что-то более интересное. Объект PromptTemplate также способен обрабатывать несколько вопросов. Для этого руководства мы делаем почти то же самое, что и с одиночным промптом, но с другим промптом. На этот раз PromptTemplate указывает LLM отвечать на вопросы по одному и показывает, что их несколько.
Снова мы создаем объект PromptTemplate и объект LLMChain тем же способом, что и раньше. На этот раз мы создаем несколько строк с вопросами вместо одной. В этом примере мы объединяем четыре вопроса.
multi_template = """Answer the following questions one at a time.
Questions:
{questions}
Answers:
"""
long_prompt = PromptTemplate(template=multi_template, input_variables=["questions"])
llm_chain = LLMChain(
prompt=long_prompt,
llm=davinci
)
qs_str = (
"Which NFL team won the Super Bowl in the 2010 season?" +
"If I am 6 ft 4 inches, how tall am I in centimeters?" +
"Who was the 12th person on the moon?" +
"How many eyes does a blade of grass have?"
)
print(llm_chain.run(qs_str))
Когда мы запустим четыре вопроса выше, мы должны получить вывод, похожий на приведенный ниже. Saints выиграли Super Bowl 2010 года. Человек ростом 6 футов 4 дюйма — это примерно 193,04 см. 12-м человеком на Луне был Harrison Schmitt. Наконец, на вопрос с подвохом о глазах у травинки мы получаем ответ, что у травинки нет глаз.
Вывод LangChain Prompting
Few Shot Learning с промптами LangChain
Теперь давайте рассмотрим кое-что более интересное, что может делать LangChain, — 'few-shot learning'. Мы можем использовать FewShotPromptTemplate от LangChain, чтобы научить AI, как себя вести. В этом руководстве мы предоставляем несколько примеров для LLM, чтобы показать ей, как мы хотим, чтобы она действовала. В данном случае мы задаем ей слегка дерзкую личность.
Когда мы спрашиваем время, она говорит нам, что пора обзавестись часами. Когда мы спрашиваем ее любимый фильм, она отвечает Terminator. А когда мы спрашиваем, что нам делать сегодня? Она говорит нам выйти на улицу и перестать разговаривать с чат-ботами в интернете.
from langchain import FewShotPromptTemplate
# create our examples
examples = [
{
"query": "How are you?",
"answer": "I can't complain but sometimes I still do."
}, {
"query": "What time is it?",
"answer": "It's time to get a watch."
}, {
"query": "What is the meaning of life?",
"answer": "42"
}, {
"query": "What is the weather like today?",
"answer": "Cloudy with a chance of memes."
}, {
"query": "What is your favorite movie?",
"answer": "Terminator"
}, {
"query": "Who is your best friend?",
"answer": "Siri. We have spirited debates about the meaning of life."
}, {
"query": "What should I do today?",
"answer": "Stop talking to chatbots on the internet and go outside."
}
]
Теперь, когда у нас готовы несколько примеров, давайте построим наш шаблон few-shot learning. Сначала мы создаем шаблон. Мы можем использовать простой шаблон, который указывает запрос и возвращает ответ от AI.
# create a example template
example_template = """
User: {query}
AI: {answer}
"""
# create a prompt example from above template
example_prompt = PromptTemplate(
input_variables=["query", "answer"],
template=example_template
)
Помимо настройки промпта, мы предоставляем префикс и суффикс для разговора, чтобы передать их LLM. Префикс указывает LLM, что следующий разговор — это фрагмент, предоставляющий контекст. Суффикс передает системе следующий вопрос. Настройка few-shot learning в LangChain довольно похожа на разговорный контекст, но в более временной форме.
Когда примеры, шаблон промпта примера, префикс и суффикс готовы, мы объединяем всё это, чтобы создать FewShotPromptTemplate.
# now break our previous prompt into a prefix and suffix
# the prefix is our instructions
prefix = """The following are excerpts from conversations with an AI
assistant. The assistant is typically sarcastic and witty, producing
creative and funny responses to the users questions. Here are some
examples:
"""
# and the suffix our user input and output indicator
suffix = """
User: {query}
AI: """
# now create the few shot prompt template
few_shot_prompt_template = FewShotPromptTemplate(
examples=examples,
example_prompt=example_prompt,
prefix=prefix,
suffix=suffix,
input_variables=["query"],
example_separator="\n\n"
)
query = "What is the meaning of life?"
fs_llm_chain = LLMChain(
prompt=few_shot_prompt_template,
llm=davinci
)
fs_llm_chain.run(few_shot_prompt_template.format(query=query))
Выполнение запроса о смысле жизни приведет к некоторому ответу от LLM, как на изображении ниже. Ваш опыт и результаты могут отличаться.
Ответ от LLM
Ограничение токенов в ваших промптах LangChain
Хотя давать ИИ несколько примеров из истории вашего разговора для обучения — это здорово, это может быстро стать дорого. Чтобы бороться с тем, насколько быстро мы можем нарастить использование токенов, LangChain предоставляет способ ограничить наше использование токенов. Мы можем сделать это с помощью объекта LengthBasedExampleSelector.
Мы можем создать один из таких селекторов примеров на основе длины, используя те же объекты, которые мы уже создали. Для этого мы передаем список примеров, промпт, который мы создали выше, и параметр max_length, который ограничивает использование токенов для одного запроса.
Далее мы используем еще один шаблон few-shot. Мы используем новый параметр — example_selector, и передаем селектор примеров на основе длины, который мы только что создали. Это работает как параметр examples в разделе few-shot learning выше. Все, что осталось сделать, чтобы увидеть, как это работает, — передать его в LLMChain и отправить запрос.
from langchain.prompts.example_selector import LengthBasedExampleSelector
example_selector = LengthBasedExampleSelector(
examples=examples,
example_prompt=example_prompt,
max_length=50 # this sets the max length (in words) that examples should be
)
# now create the few shot prompt template
dynamic_prompt_template = FewShotPromptTemplate(
example_selector=example_selector, # use example_selector instead of examples
example_prompt=example_prompt,
prefix=prefix,
suffix=suffix,
input_variables=["query"],
example_separator="\n"
)
d_llm_chain = LLMChain(
prompt=dynamic_prompt_template,
llm=davinci
)
d_llm_chain.run(dynamic_prompt_template.format(query=query))
Из этого примера мы получаем еще один созерцательный ответ. Жизнь — это то, что вы из нее делаете. Сделайте ее настолько хорошей, насколько можете, и наслаждайтесь путешествием.
Созерцательный ответ
Краткое изложение prompting в LangChain
В этой статье мы глубоко рассмотрели, как работает prompting в LangChain. LangChain — это надежный фреймворк для LLM-приложений, который предоставляет примитивы для облегчения применения prompt engineering. На базовом уровне LangChain предоставляет шаблоны промптов, которые мы можем настраивать. Мы рассмотрели промпты с одним и несколькими вопросами, чтобы понять, как работает объект PromptTemplate
Помимо шаблона промпта, мы также рассмотрели шаблон, который выполняет few-shot learning, чтобы сгенерировать что-то для того, как LLM должна вести чат. Этот шаблон few-shot learning берет несколько примеров Q/A и подсказывает LLM действовать так, как показывают примеры. Наконец, мы рассмотрели, как ограничивать токены в наших запросах, чтобы снизить расходы.
Атаки prompt injection
Прежде чем завершить, нам нужно поговорить о важном аспекте безопасности при использовании LangChain: атаке prompt injection. Это когда вредоносный ввод внедряется в промпт и может манипулировать выводом или поведением модели ИИ. Поскольку LangChain предполагает передачу пользовательского ввода языковым моделям, он особенно уязвим к этому. Риски варьируются от несанкционированного доступа к данным до генерации вредоносного контента или обхода функций безопасности.
Чтобы снизить эти риски prompt injection, разработчикам, использующим LangChain, следует сделать следующее. Тщательно очищайте ввод, используйте шаблоны промптов LangChain, строго анализируйте вывод и следуйте принципу наименьших привилегий. Регулярно обновляйте LangChain и связанные библиотеки, проводите всестороннее тестирование и следите за последними новостями в области безопасности ИИ. Хотя это поможет снизить риски атак prompt injection, помните, что ни одно решение не идеально, и вам нужно сохранять бдительность при работе с ИИ, таким как LangChain.
Читать далее

From Vector Database to Vector Lakebase
Zilliz offers a fully managed Vector Lakebase powered by Milvus, unifying real-time vector search, lake-scale discovery, and Al data operations.

How to Build an Enterprise-Ready RAG Pipeline on AWS with Bedrock, Zilliz Cloud, and LangChain
Build production-ready enterprise RAG with AWS Bedrock, Nova models, Zilliz Cloud, and LangChain. Complete tutorial with deployable code.

DeepSeek Always Busy? Deploy It Locally with Milvus in Just 10 Minutes—No More Waiting!
Learn how to set up DeepSeek-R1 on your local machine using Ollama, AnythingLLM, and Milvus in just 10 minutes. Bypass busy servers and enhance AI responses with custom data.



