Commit ·
97d967b
1
Parent(s): d9d3fe7
Fix tokenizer output
Browse files- requirements.txt +1 -1
- src/backend/llm/client.py +15 -13
requirements.txt
CHANGED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
transformers
|
| 2 |
-
sentencepiece
|
| 3 |
sentence-transformers
|
|
|
|
| 4 |
accelerate
|
| 5 |
faiss-cpu
|
| 6 |
numpy
|
|
|
|
| 1 |
transformers
|
|
|
|
| 2 |
sentence-transformers
|
| 3 |
+
sentencepiece
|
| 4 |
accelerate
|
| 5 |
faiss-cpu
|
| 6 |
numpy
|
src/backend/llm/client.py
CHANGED
|
@@ -97,26 +97,31 @@ class _LocalTransformersClient(LLMClient):
|
|
| 97 |
)
|
| 98 |
self._model.eval()
|
| 99 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 100 |
def chat(self, messages: list[ChatMessage], **kwargs) -> str:
|
| 101 |
import torch
|
| 102 |
|
| 103 |
self._ensure_loaded()
|
| 104 |
-
|
| 105 |
-
inputs = self._tokenizer.apply_chat_template(
|
| 106 |
-
chat_messages,
|
| 107 |
-
add_generation_prompt=True,
|
| 108 |
-
return_tensors="pt",
|
| 109 |
-
).to(self._model.device)
|
| 110 |
temperature = kwargs.get("temperature", self.temperature)
|
| 111 |
with torch.no_grad():
|
| 112 |
out = self._model.generate(
|
| 113 |
-
|
| 114 |
max_new_tokens=kwargs.get("max_new_tokens", self.max_new_tokens),
|
| 115 |
do_sample=temperature > 0,
|
| 116 |
temperature=temperature if temperature > 0 else None,
|
| 117 |
pad_token_id=self._tokenizer.eos_token_id,
|
| 118 |
)
|
| 119 |
-
generated = out[0][
|
| 120 |
return self._tokenizer.decode(generated, skip_special_tokens=True).strip()
|
| 121 |
|
| 122 |
def stream(self, messages: list[ChatMessage], **kwargs):
|
|
@@ -127,16 +132,13 @@ class _LocalTransformersClient(LLMClient):
|
|
| 127 |
from transformers import TextIteratorStreamer
|
| 128 |
|
| 129 |
self._ensure_loaded()
|
| 130 |
-
|
| 131 |
-
inputs = self._tokenizer.apply_chat_template(
|
| 132 |
-
chat_messages, add_generation_prompt=True, return_tensors="pt"
|
| 133 |
-
).to(self._model.device)
|
| 134 |
temperature = kwargs.get("temperature", self.temperature)
|
| 135 |
streamer = TextIteratorStreamer(
|
| 136 |
self._tokenizer, skip_prompt=True, skip_special_tokens=True
|
| 137 |
)
|
| 138 |
gen_kwargs = dict(
|
| 139 |
-
input_ids=
|
| 140 |
streamer=streamer,
|
| 141 |
max_new_tokens=kwargs.get("max_new_tokens", self.max_new_tokens),
|
| 142 |
do_sample=temperature > 0,
|
|
|
|
| 97 |
)
|
| 98 |
self._model.eval()
|
| 99 |
|
| 100 |
+
def _tokenize_chat(self, messages: list[ChatMessage]):
|
| 101 |
+
"""Apply the chat template and return input_ids as a (1, S) tensor."""
|
| 102 |
+
import torch
|
| 103 |
+
|
| 104 |
+
chat_messages = [{"role": m.role, "content": m.content} for m in messages]
|
| 105 |
+
token_ids = self._tokenizer.apply_chat_template(
|
| 106 |
+
chat_messages, add_generation_prompt=True,
|
| 107 |
+
)
|
| 108 |
+
return torch.tensor([token_ids], device=self._model.device)
|
| 109 |
+
|
| 110 |
def chat(self, messages: list[ChatMessage], **kwargs) -> str:
|
| 111 |
import torch
|
| 112 |
|
| 113 |
self._ensure_loaded()
|
| 114 |
+
input_ids = self._tokenize_chat(messages)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 115 |
temperature = kwargs.get("temperature", self.temperature)
|
| 116 |
with torch.no_grad():
|
| 117 |
out = self._model.generate(
|
| 118 |
+
input_ids,
|
| 119 |
max_new_tokens=kwargs.get("max_new_tokens", self.max_new_tokens),
|
| 120 |
do_sample=temperature > 0,
|
| 121 |
temperature=temperature if temperature > 0 else None,
|
| 122 |
pad_token_id=self._tokenizer.eos_token_id,
|
| 123 |
)
|
| 124 |
+
generated = out[0][input_ids.shape[-1] :] # noqa
|
| 125 |
return self._tokenizer.decode(generated, skip_special_tokens=True).strip()
|
| 126 |
|
| 127 |
def stream(self, messages: list[ChatMessage], **kwargs):
|
|
|
|
| 132 |
from transformers import TextIteratorStreamer
|
| 133 |
|
| 134 |
self._ensure_loaded()
|
| 135 |
+
input_ids = self._tokenize_chat(messages)
|
|
|
|
|
|
|
|
|
|
| 136 |
temperature = kwargs.get("temperature", self.temperature)
|
| 137 |
streamer = TextIteratorStreamer(
|
| 138 |
self._tokenizer, skip_prompt=True, skip_special_tokens=True
|
| 139 |
)
|
| 140 |
gen_kwargs = dict(
|
| 141 |
+
input_ids=input_ids,
|
| 142 |
streamer=streamer,
|
| 143 |
max_new_tokens=kwargs.get("max_new_tokens", self.max_new_tokens),
|
| 144 |
do_sample=temperature > 0,
|