Модель SagemakerEndpoint не возвращает полный вывод, только при появлении запроса с помощью langchain

У меня есть модель Huggingface, развернутая за конечной точкой sagemaker, которая выдает ожидаемые результаты при прямом прогнозировании против нее. Однако, когда я инициализирую его с помощью класса SagemakerEndpoint из langchain, он возвращает только два символа, а иногда и пустую строку. За последние пару дней я просмотрел документацию в Интернете и langchain, и мои аспекты инициализации и цепочки подсказок кода, кажется, соответствуют рекомендациям документации и изложенным анекдотическим рекомендациям. Я думаю, что либо отсутствует поддержка интеграции для моделей HuggingFace, развернутых с помощью sagemaker, либо мне здесь не хватает чего-то, чего не написано в документации и примерах. Пожалуйста, просмотрите и дайте мне знать в любом случае.

Соответствующий блок кода, который будет воспроизводить поведение:

      endpoint = "xxxxxx-2023-07-14-05-34-901"

parameters = {
    "do_sample": True,
    "top_p": 0.95,
    "temperature": 0.1,
    "max_new_tokens": 256,
    "num_return_sequences": 4,
}
    
class ContentHandler(LLMContentHandler):
        content_type = "application/json"
        accepts = "application/json"
        
        def transform_input(self, prompt: str, model_kwargs: Dict) -> bytes:
            input_str = json.dumps({"inputs": prompt, **model_kwargs})
            return input_str.encode('utf-8')
        
        def transform_output(self, output: bytes) -> str:
            response_json = json.loads(output.read().decode("utf-8"))
            return response_json[0]['generated_text']
        
content_handler = ContentHandler()
        
sm_llm=SagemakerEndpoint(
        endpoint_name=endpoint,
#        credentials_profile_name="credentials-profile-name",
        region_name="us-west-2",
        model_kwargs= parameters,
        content_handler=content_handler,
    )

print("sm_llm: ", sm_llm)

vectordb = Chroma(persist_directory="db", embedding_function=embedding, collection_name="docs")
retriever = vectordb.as_retriever(search_kwargs={'k':3})
print("retriever: ", retriever)

qa_chain = RetrievalQA.from_chain_type(llm=sm_llm, 
                                  chain_type="stuff", 
                                  retriever=retriever,
                                  return_source_documents=True)

Подсказка:

      system_prompt = """<|SYSTEM|># Your are a helpful and harmless assistant for providing clear and succint answers to questions."""

question = "What is your purpose?"
query = (system_prompt + "<|USER|>" + question + "<|ASSISTANT|>")
llm_response = qa_chain(query)
print(llm_response['result'])

----------------------------------------------------------------

Output:
Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer.

<some doc context from vectordb goes here - removed due to info sensitivity>

Question: # Your are a helpful and harmless assistant for providing clear and succint answers to questions.
What is your purpose?
Helpful Answer: 

Как показано, модель не возвращает никаких выходных данных для «Полезного ответа:» в этом параметре при запросе RetrivalQA из langchain. Это не тот случай, когда я подсказываю модель напрямую с помощью функции predictor.predict().

2 ответа

У меня была та же проблема. При использовании HuggingFaceEndpoint все работало нормально, но когда я перешел на SagemakerEndpoint, ответы были усечены. Мне удалось отладить код и обнаружить, что кварги модели не передавались должным образом, поэтому мойtransform_inputвыглядит так:

      
def transform_input(self, prompt: str) -> bytes:
        request = {'inputs': prompt,
                    "parameters": { "do_sample": True,
                                "top_p": 0.9,
                                "temperature": 0.85,
                                "max_new_tokens": 1024,
                                "stop": ["<|endoftext|>", "</s>"],
                                "early_stopping": True}}

        input_str = json.dumps(request)
        print(input_str)
        return input_str.encode('utf-8')

Я столкнулся с той же проблемой. При прямом использовании Sagemaker Endpoint возвращается полный ответ. Кроме того, при попытке использовать langchain.HuggingFaceHub он возвращает полный ответ. LLMContentHandler возвращает усеченный ответ.

      from langchain import PromptTemplate, LLMChain
ENDPOINT_NAME = "open-chat-falcon-7B-24-07-2023-05-44-26"

from typing import Dict

from langchain import PromptTemplate, SagemakerEndpoint
from langchain.llms.sagemaker_endpoint import LLMContentHandler
import json]

parameters = {
"early_stopping": True,
"length_penalty": 2.0,
"max_new_tokens": 1024,
"temperature": 0.01,
}

class ContentHandler(LLMContentHandler):
content_type = "application/json"
accepts = "application/json"

def transform_input(self, prompt: str, model_kwargs: Dict) -> bytes:
    input_str = json.dumps({"inputs": prompt, **model_kwargs})
    return input_str.encode("utf-8")

def transform_output(self, output: bytes) -> str:
    response_json = json.loads(output.read().decode("utf-8"))
    return response_json[0]["generated_text"]
content_handler = ContentHandler()

llm=SagemakerEndpoint(
endpoint_name=ENDPOINT_NAME,
region_name="us-west-2",
model_kwargs=parameters,
content_handler=content_handler,
)

template = """
You are an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions.

{question}
"""
prompt = PromptTemplate(template=template, input_variables=["question"])
llm_chain = LLMChain(prompt=prompt, llm=llm)

question = "Write a resignation letter addressing the manager"

print(llm_chain.run(question))

ВЫВОД: Вы помощник искусственного интеллекта. Помощник дает полезные, подробные и вежливые ответы на вопросы пользователя.

Напишите заявление об увольнении на имя руководителя Уважаемый [Менеджер!

Пишу, чтобы сообщить Вам о своем намерении уйти со своей должности.

      llm.predict(question)

ВЫВОД: Напишите заявление об увольнении на имя менеджера.\nУважаемый [Менеджер],\n\nПишу, чтобы сообщить Вам о своем намерении уйти с должности.

      import boto3
import json
import time

runtime= boto3.client('runtime.sagemaker')

payload = """Write a resignation letter addressing the manager"""

parameters = {
"early_stopping": True,
"length_penalty": 2.0,
"max_new_tokens": 1024,
"temperature": 0.01,
}

start = time.time()
response = runtime.invoke_endpoint(EndpointName=ENDPOINT_NAME,
ContentType='application/json',
Body=json.dumps({
"inputs": payload,
"parameters": parameters
})
)
time_taken = (time.time() - start)
output = json.loads(response['Body'].read())

print("Time Taken (s): ", time_taken)
print(output[0]['generated_text'])

ВЫВОД: Написать заявление об увольнении на имя руководителя Уважаемый [Менеджер],

Я пишу, чтобы сообщить вам о своем намерении уйти в отставку с моей нынешней должности в [Название компании]. Мой последний рабочий день будет [вставить дату].

Я ценю время, проведенное здесь, и возможности, предоставленные мне. За время работы в компании я многому научился и вырос профессионально.

Я уверен, что смогу найти подходящую должность в будущем. Если вам понадобится помощь во время этого перехода, пожалуйста, не стесняйтесь обращаться ко мне.

Благодарю вас за предоставленную возможность и с нетерпением жду вашего ответа.

С уважением,[Ваше имя]

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