Skip to content

Commit 79d8ae4

Browse files
authored
[UT Fix] Fix bad_words test (#3385)
* fix bad_words test * add streaming * fix * fix
1 parent 1e06b9f commit 79d8ae4

File tree

1 file changed

+109
-50
lines changed

1 file changed

+109
-50
lines changed

test/ci_use/EB_Lite/test_EB_Lite_serving.py

Lines changed: 109 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -784,43 +784,54 @@ def test_non_streaming_chat_with_bad_words(openai_client, capsys):
784784
"""
785785
Test bad_words option in non-streaming chat functionality with the local service
786786
"""
787+
base_path = os.getenv("MODEL_PATH")
788+
if base_path:
789+
model_path = os.path.join(base_path, "ernie-4_5-21b-a3b-bf16-paddle")
790+
else:
791+
model_path = "./ernie-4_5-21b-a3b-bf16-paddle"
787792
response_0 = openai_client.chat.completions.create(
788793
model="default",
789794
messages=[{"role": "user", "content": "Hello, how are you?"}],
790795
temperature=1,
791796
top_p=0.0,
792-
max_tokens=10,
797+
max_tokens=20,
793798
stream=False,
799+
extra_body={"return_token_ids": True},
794800
)
795-
output_0 = []
801+
796802
assert hasattr(response_0, "choices")
797803
assert len(response_0.choices) > 0
798804
assert hasattr(response_0.choices[0], "message")
799-
assert hasattr(response_0.choices[0].message, "content")
805+
assert hasattr(response_0.choices[0].message, "completion_token_ids")
806+
assert isinstance(response_0.choices[0].message.completion_token_ids, list)
807+
808+
from fastdeploy.input.ernie_tokenizer import ErnieBotTokenizer
800809

801-
text_split = response_0.choices[0].message.content.split(" ")
802-
for text in text_split:
803-
output_0.append(text)
810+
tokenizer = ErnieBotTokenizer.from_pretrained(model_path, trust_remote_code=True)
811+
output_tokens_0 = []
812+
output_ids_0 = []
813+
for ids in response_0.choices[0].message.completion_token_ids:
814+
output_tokens_0.append(tokenizer.decode(ids))
815+
output_ids_0.append(ids)
804816

805817
# add bad words
818+
bad_tokens = output_tokens_0[6:10]
819+
bad_token_ids = output_ids_0[6:10]
806820
response_1 = openai_client.chat.completions.create(
807821
model="default",
808822
messages=[{"role": "user", "content": "Hello, how are you?"}],
809823
temperature=1,
810824
top_p=0.0,
811-
max_tokens=10,
812-
extra_body={"bad_words": output_0[-5:]},
825+
max_tokens=20,
826+
extra_body={"bad_words": bad_tokens, "return_token_ids": True},
813827
stream=False,
814828
)
815-
output_1 = []
816829
assert hasattr(response_1, "choices")
817830
assert len(response_1.choices) > 0
818831
assert hasattr(response_1.choices[0], "message")
819-
assert hasattr(response_1.choices[0].message, "content")
820-
text_split = response_1.choices[0].message.content.split(" ")
821-
for text in text_split:
822-
output_1.append(text)
823-
assert output_0 not in output_1
832+
assert hasattr(response_1.choices[0].message, "completion_token_ids")
833+
assert isinstance(response_1.choices[0].message.completion_token_ids, list)
834+
assert not any(ids in response_1.choices[0].message.completion_token_ids for ids in bad_token_ids)
824835

825836

826837
def test_streaming_chat_with_bad_words(openai_client, capsys):
@@ -832,75 +843,106 @@ def test_streaming_chat_with_bad_words(openai_client, capsys):
832843
messages=[{"role": "user", "content": "Hello, how are you?"}],
833844
temperature=1,
834845
top_p=0.0,
835-
max_tokens=10,
846+
max_tokens=20,
836847
stream=True,
848+
extra_body={"return_token_ids": True},
837849
)
838-
output_0 = []
850+
output_tokens_0 = []
851+
output_ids_0 = []
852+
is_first_chunk = True
839853
for chunk in response_0:
840854
assert hasattr(chunk, "choices")
841855
assert len(chunk.choices) > 0
842856
assert hasattr(chunk.choices[0], "delta")
843857
assert hasattr(chunk.choices[0].delta, "content")
844-
output_0.append(chunk.choices[0].delta.content)
858+
assert hasattr(chunk.choices[0].delta, "completion_token_ids")
859+
if is_first_chunk:
860+
is_first_chunk = False
861+
else:
862+
assert isinstance(chunk.choices[0].delta.completion_token_ids, list)
863+
output_tokens_0.append(chunk.choices[0].delta.content)
864+
output_ids_0.extend(chunk.choices[0].delta.completion_token_ids)
845865

846866
# add bad words
867+
bad_tokens = output_tokens_0[6:10]
868+
bad_token_ids = output_ids_0[6:10]
847869
response_1 = openai_client.chat.completions.create(
848870
model="default",
849871
messages=[{"role": "user", "content": "Hello, how are you?"}],
850872
temperature=1,
851873
top_p=0.0,
852-
max_tokens=10,
853-
extra_body={"bad_words": output_0[-5:]},
874+
max_tokens=20,
875+
extra_body={"bad_words": bad_tokens, "return_token_ids": True},
854876
stream=True,
855877
)
856-
output_1 = []
878+
output_tokens_1 = []
879+
output_ids_1 = []
880+
is_first_chunk = True
857881
for chunk in response_1:
858882
assert hasattr(chunk, "choices")
859883
assert len(chunk.choices) > 0
860884
assert hasattr(chunk.choices[0], "delta")
861885
assert hasattr(chunk.choices[0].delta, "content")
862-
output_1.append(chunk.choices[0].delta.content)
863-
assert output_0 not in output_1
886+
assert hasattr(chunk.choices[0].delta, "completion_token_ids")
887+
if is_first_chunk:
888+
is_first_chunk = False
889+
else:
890+
assert isinstance(chunk.choices[0].delta.completion_token_ids, list)
891+
output_tokens_1.append(chunk.choices[0].delta.content)
892+
output_ids_1.extend(chunk.choices[0].delta.completion_token_ids)
893+
assert not any(ids in output_ids_1 for ids in bad_token_ids)
864894

865895

866896
def test_non_streaming_completion_with_bad_words(openai_client, capsys):
867897
"""
868898
Test bad_words option in non-streaming completion functionality with the local service
869899
"""
900+
base_path = os.getenv("MODEL_PATH")
901+
if base_path:
902+
model_path = os.path.join(base_path, "ernie-4_5-21b-a3b-bf16-paddle")
903+
else:
904+
model_path = "./ernie-4_5-21b-a3b-bf16-paddle"
905+
870906
response_0 = openai_client.completions.create(
871907
model="default",
872908
prompt="Hello, how are you?",
873909
temperature=1,
874910
top_p=0.0,
875-
max_tokens=10,
911+
max_tokens=20,
876912
stream=False,
913+
extra_body={"return_token_ids": True},
877914
)
878-
output_0 = []
879915
assert hasattr(response_0, "choices")
880916
assert len(response_0.choices) > 0
881-
assert hasattr(response_0.choices[0], "text")
882-
text_split = response_0.choices[0].text.split(" ")
883-
for text in text_split:
884-
output_0.append(text)
917+
assert hasattr(response_0.choices[0], "completion_token_ids")
918+
assert isinstance(response_0.choices[0].completion_token_ids, list)
919+
920+
from fastdeploy.input.ernie_tokenizer import ErnieBotTokenizer
921+
922+
tokenizer = ErnieBotTokenizer.from_pretrained(model_path, trust_remote_code=True)
923+
output_tokens_0 = []
924+
output_ids_0 = []
925+
for ids in response_0.choices[0].completion_token_ids:
926+
output_tokens_0.append(tokenizer.decode(ids))
927+
output_ids_0.append(ids)
885928

886929
# add bad words
930+
bad_tokens = output_tokens_0[6:10]
931+
bad_token_ids = output_ids_0[6:10]
887932
response_1 = openai_client.completions.create(
888933
model="default",
889934
prompt="Hello, how are you?",
890935
temperature=1,
891936
top_p=0.0,
892-
max_tokens=10,
893-
extra_body={"bad_words": output_0[-5:]},
937+
max_tokens=20,
938+
extra_body={"bad_words": bad_tokens, "return_token_ids": True},
894939
stream=False,
895940
)
896-
output_1 = []
897941
assert hasattr(response_1, "choices")
898942
assert len(response_1.choices) > 0
899-
assert hasattr(response_1.choices[0], "text")
900-
text_split = response_1.choices[0].text.split(" ")
901-
for text in text_split:
902-
output_1.append(text)
903-
assert output_0 not in output_1
943+
assert hasattr(response_0.choices[0], "completion_token_ids")
944+
assert isinstance(response_0.choices[0].completion_token_ids, list)
945+
assert not any(ids in response_1.choices[0].completion_token_ids for ids in bad_token_ids)
904946

905947

906948
def test_streaming_completion_with_bad_words(openai_client, capsys):
@@ -912,30 +954,47 @@ def test_streaming_completion_with_bad_words(openai_client, capsys):
912954
prompt="Hello, how are you?",
913955
temperature=1,
914956
top_p=0.0,
915-
max_tokens=10,
957+
max_tokens=20,
916958
stream=True,
959+
extra_body={"return_token_ids": True},
917960
)
918-
output_0 = []
961+
output_tokens_0 = []
962+
output_ids_0 = []
963+
is_first_chunk = True
919964
for chunk in response_0:
920-
assert hasattr(chunk, "choices")
921-
assert len(chunk.choices) > 0
922-
assert hasattr(chunk.choices[0], "text")
923-
output_0.append(chunk.choices[0].text)
965+
if is_first_chunk:
966+
is_first_chunk = False
967+
else:
968+
assert hasattr(chunk, "choices")
969+
assert len(chunk.choices) > 0
970+
assert hasattr(chunk.choices[0], "text")
971+
assert hasattr(chunk.choices[0], "completion_token_ids")
972+
output_tokens_0.append(chunk.choices[0].text)
973+
output_ids_0.extend(chunk.choices[0].completion_token_ids)
924974

925975
# add bad words
976+
bad_token_ids = output_ids_0[6:10]
977+
bad_tokens = output_tokens_0[6:10]
926978
response_1 = openai_client.completions.create(
927979
model="default",
928980
prompt="Hello, how are you?",
929981
temperature=1,
930982
top_p=0.0,
931-
max_tokens=10,
932-
extra_body={"bad_words": output_0[-5:]},
983+
max_tokens=20,
984+
extra_body={"bad_words": bad_tokens, "return_token_ids": True},
933985
stream=True,
934986
)
935-
output_1 = []
987+
output_tokens_1 = []
988+
output_ids_1 = []
989+
is_first_chunk = True
936990
for chunk in response_1:
937-
assert hasattr(chunk, "choices")
938-
assert len(chunk.choices) > 0
939-
assert hasattr(chunk.choices[0], "text")
940-
output_1.append(chunk.choices[0].text)
941-
assert output_0 not in output_1
991+
if is_first_chunk:
992+
is_first_chunk = False
993+
else:
994+
assert hasattr(chunk, "choices")
995+
assert len(chunk.choices) > 0
996+
assert hasattr(chunk.choices[0], "text")
997+
assert hasattr(chunk.choices[0], "completion_token_ids")
998+
output_tokens_1.append(chunk.choices[0].text)
999+
output_ids_1.extend(chunk.choices[0].completion_token_ids)
1000+
assert not any(ids in output_ids_1 for ids in bad_token_ids)

0 commit comments

Comments
 (0)