В настоящее время я получаю несколько ответов, или модель не знает, когда завершить ответ, и, похоже, повторяет системное приглашение в ответе (?). Я просто хочу получить один ответ. Моя настройка очень проста, поэтому я предполагаю, что мне не хватает деталей реализации, но что я могу сделать, чтобы вернуть только один ответ?
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
(отдельно и не связанно с рассматриваемой проблемой, в вашем приглашении много пробелов, которые вы, вероятно, не захотите платить за токенизацию и отправку по сети).
@CharlesDuffy, полагаю, я не устанавливаю токены завершения? Где или как мне следует? В противном случае я запускаю это локально на Ламе 3 8B.
Я не использую ollama, но самый первый хит Google — github.com/ollama/ollama/issues/3759 — выглядит подходящим местом для начала. Для процесса, выполняющего декодирование, необходимо установить токены остановки, сообщающие коду, который получает результаты из LLM (переходя от вероятностей к конкретным токенам), что следует распознавать в качестве индикатора того, что ответ завершен и он может прекратить чтение. См. настройку отчета о комментариях stop=
по звонку как успешную.
Я уже подсмотрел этого @CharlesDuffy. Ради интереса я поставил <|eot_id|>
в конце, но это не остановило.
...а вы пробовали этот конкретный stop=["<|start_header_id|>", "<|end_header_id|>", "<|eot_id|>", "<|reserved_special_token"]
аргумент?
(когда вы говорите «добавили <|eot_id|>
в конце», вы имеете в виду конец подсказки? Это не входит в подсказку; на самом деле, точно следуйте советам, данным в комментарии к заявке).
Используя 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
Где вы устанавливаете конечные токены, чтобы остановить декодирование?