Langchain, Ollama и Llama 3 подсказка и ответ

В настоящее время я получаю несколько ответов, или модель не знает, когда завершить ответ, и, похоже, повторяет системное приглашение в ответе (?). Я просто хочу получить один ответ. Моя настройка очень проста, поэтому я предполагаю, что мне не хватает деталей реализации, но что я могу сделать, чтобы вернуть только один ответ?

from langchain_community.llms import Ollama

llm = Ollama(model = "llama3")

def get_model_response(user_prompt, system_prompt):
    prompt = f"""
        <|begin_of_text|>
        <|start_header_id|>system<|end_header_id|>
        { system_prompt }
        <|eot_id|>
        <|start_header_id|>user<|end_header_id|>
        { user_prompt }
        <|eot_id|>
        <|start_header_id|>assistant<|end_header_id|>
        """
    response = llm.invoke(prompt)
    return response

Где вы устанавливаете конечные токены, чтобы остановить декодирование?

Charles Duffy 04.05.2024 20:10

(отдельно и не связанно с рассматриваемой проблемой, в вашем приглашении много пробелов, которые вы, вероятно, не захотите платить за токенизацию и отправку по сети).

Charles Duffy 04.05.2024 20:10

@CharlesDuffy, полагаю, я не устанавливаю токены завершения? Где или как мне следует? В противном случае я запускаю это локально на Ламе 3 8B.

Brett Doffing 04.05.2024 20:16

Я не использую ollama, но самый первый хит Google — github.com/ollama/ollama/issues/3759 — выглядит подходящим местом для начала. Для процесса, выполняющего декодирование, необходимо установить токены остановки, сообщающие коду, который получает результаты из LLM (переходя от вероятностей к конкретным токенам), что следует распознавать в качестве индикатора того, что ответ завершен и он может прекратить чтение. См. настройку отчета о комментариях stop= по звонку как успешную.

Charles Duffy 04.05.2024 20:22

Я уже подсмотрел этого @CharlesDuffy. Ради интереса я поставил <|eot_id|> в конце, но это не остановило.

Brett Doffing 04.05.2024 20:27

...а вы пробовали этот конкретный stop=["<|start_header_id|>", "<|end_header_id|>", "<|eot_id|>", "<|reserved_special_token"] аргумент?

Charles Duffy 04.05.2024 20:27

(когда вы говорите «добавили <|eot_id|> в конце», вы имеете в виду конец подсказки? Это не входит в подсказку; на самом деле, точно следуйте советам, данным в комментарии к заявке).

Charles Duffy 04.05.2024 20:45
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
7
10 671
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Используя PromptTemplate из Langchain и установив для модели стоп-токен, я смог получить единственный правильный ответ.

from langchain_community.llms import Ollama
from langchain import PromptTemplate # Added

llm = Ollama(model = "llama3", stop=["<|eot_id|>"]) # Added stop token

def get_model_response(user_prompt, system_prompt):
    # NOTE: No f string and no whitespace in curly braces
    template = """
        <|begin_of_text|>
        <|start_header_id|>system<|end_header_id|>
        {system_prompt}
        <|eot_id|>
        <|start_header_id|>user<|end_header_id|>
        {user_prompt}
        <|eot_id|>
        <|start_header_id|>assistant<|end_header_id|>
        """

    # Added prompt template
    prompt = PromptTemplate(
        input_variables=["system_prompt", "user_prompt"],
        template=template
    )
    
    # Modified invoking the model
    response = llm(prompt.format(system_prompt=system_prompt, user_prompt=user_prompt))
    
    return response

Вот пример кода для работы с Langchain и LlamaCpp с локальным файлом модели. Библиотека настаивает на использовании метода вызова, а не на прямом вызове «llm(message)».

from langchain_community.llms import LlamaCpp
from langchain_core.prompts import PromptTemplate

llm = LlamaCpp(
    model_path = "C:\\Users\\LENOVO\\models\\QuantFactory\\Meta-Llama-3-8B-Instruct-GGUF\\Meta-Llama-3-8B-Instruct.Q3_K_L.gguf",
    n_gpu_layers=-1,
    temperature=0,
    stop=["<|eot_id|>"],
)

template = """
        <|begin_of_text|>
        <|start_header_id|>system<|end_header_id|>
        {system_prompt}
        <|eot_id|>
        <|start_header_id|>user<|end_header_id|>
        {user_prompt}
        <|eot_id|>
        <|start_header_id|>assistant<|end_header_id|>
        """
def get_response(country):
    sys_template_str = "Give a one or two word answers only."
    human_template_str = "What is capital of {country} ?"

    prompt = PromptTemplate.from_template(template.format(system_prompt = sys_template_str,
                                                          user_prompt = human_template_str))
    session = prompt | llm 
    response = session.invoke({"country":country})
    print(response)

get_response("Australia")

Я бы рекомендовал использовать функцию Hugging Face tokenizer.apply_chat_template(), которая автоматически применяет правильный шаблон чата для соответствующей модели. Это проще, чем писать шаблон чата вручную, и вероятность ошибок меньше. Документы: https://huggingface.co/docs/transformers/main/en/chat_templating

Другие вопросы по теме