Prompt util
generate_chat_template(agent_prompt_model, prompt_assemble_order)
¶
Convert the agent prompt model to the agentUniverse message list.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
agent_prompt_model |
AgentPromptModel
|
The agent prompt model. |
required |
prompt_assemble_order |
list[str]
|
The prompt assemble ordered list. |
required |
Source code in agentuniverse/base/util/prompt_util.py
Python
def generate_chat_template(agent_prompt_model: AgentPromptModel, prompt_assemble_order: list[str]) -> list[Message]:
"""Convert the agent prompt model to the agentUniverse message list.
Args:
agent_prompt_model (AgentPromptModel): The agent prompt model.
prompt_assemble_order (list[str]): The prompt assemble ordered list.
Returns:
list: The agentUniverse message list.
"""
message_list = []
for attr in prompt_assemble_order:
value = getattr(agent_prompt_model, attr, None)
if value is not None:
message_list.append(
Message(type=agent_prompt_model.get_message_type(attr), content=value))
if message_list:
# Integrate the system messages and put them in the first of the message list.
system_messages = '\n'.join(msg.content for msg in message_list if msg.type == ChatMessageEnum.SYSTEM.value)
if system_messages:
message_list = list(filter(lambda msg: msg.type != ChatMessageEnum.SYSTEM.value, message_list))
message_list.insert(0, Message(type=ChatMessageEnum.SYSTEM.value, content=system_messages))
return message_list
generate_template(agent_prompt_model, prompt_assemble_order)
¶
Convert the agent prompt model to an ordered list.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
agent_prompt_model |
AgentPromptModel
|
The agent prompt model. |
required |
prompt_assemble_order |
list[str]
|
The prompt assemble ordered list. |
required |
Source code in agentuniverse/base/util/prompt_util.py
Python
def generate_template(agent_prompt_model: AgentPromptModel, prompt_assemble_order: list[str]) -> str:
"""Convert the agent prompt model to an ordered list.
Args:
agent_prompt_model (AgentPromptModel): The agent prompt model.
prompt_assemble_order (list[str]): The prompt assemble ordered list.
Returns:
list: The ordered list.
"""
values = []
for attr in prompt_assemble_order:
value = getattr(agent_prompt_model, attr, None)
if value is not None:
values.append(value)
return "\n".join(values)
process_llm_token(agent_llm, lc_prompt_template, profile, planner_input)
¶
Process the prompt template based on the prompt processor.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
agent_llm |
LLM
|
The agent llm. |
required |
lc_prompt_template |
The langchain prompt template. |
required | |
profile |
dict
|
The profile. |
required |
planner_input |
dict
|
The planner input. |
required |
Source code in agentuniverse/base/util/prompt_util.py
Python
def process_llm_token(agent_llm: LLM, lc_prompt_template, profile: dict, planner_input: dict):
"""Process the prompt template based on the prompt processor.
Args:
agent_llm (LLM): The agent llm.
lc_prompt_template: The langchain prompt template.
profile (dict): The profile.
planner_input (dict): The planner input.
"""
llm_model: dict = profile.get('llm_model')
# get the prompt processor configuration
prompt_processor: dict = llm_model.get('prompt_processor') or dict()
prompt_processor_type: str = prompt_processor.get('type') or PromptProcessEnum.TRUNCATE.value
prompt_processor_llm: str = prompt_processor.get('llm')
# get the summary and combine prompt versions
summary_prompt_version: str = prompt_processor.get('summary_prompt_version') or 'prompt_processor.summary_cn'
combine_prompt_version: str = prompt_processor.get('combine_prompt_version') or 'prompt_processor.combine_cn'
prompt_input_dict = {key: planner_input[key] for key in lc_prompt_template.input_variables if key in planner_input}
# get the llm instance for prompt compression
prompt_llm: LLM = LLMManager().get_instance_obj(prompt_processor_llm)
if prompt_llm is None:
prompt_llm = agent_llm
prompt = lc_prompt_template.format(**prompt_input_dict)
# get the number of tokens in the prompt
prompt_tokens: int = agent_llm.get_num_tokens(prompt)
input_tokens = agent_llm.max_context_length() - agent_llm.max_tokens
if prompt_tokens <= input_tokens:
return
process_prompt_type_enum = PromptProcessEnum.from_value(prompt_processor_type)
# compress the background in the prompt
content = planner_input.get('background')
if process_prompt_type_enum == PromptProcessEnum.TRUNCATE:
planner_input['background'] = truncate_content(content, input_tokens, agent_llm)
elif process_prompt_type_enum == PromptProcessEnum.STUFF:
planner_input['background'] = summarize_by_stuff(texts=[content], llm=prompt_llm,
summary_prompt=PromptManager().get_instance_obj(
summary_prompt_version))
elif process_prompt_type_enum == PromptProcessEnum.MAP_REDUCE:
planner_input['background'] = summarize_by_map_reduce(texts=split_texts([content], agent_llm), llm=prompt_llm,
summary_prompt=PromptManager().get_instance_obj(
summary_prompt_version),
combine_prompt=PromptManager().get_instance_obj(
combine_prompt_version))
split_text_on_tokens(text, text_token, chunk_size=800, chunk_overlap=100)
¶
Split incoming text and return chunks using tokenizer.
Source code in agentuniverse/base/util/prompt_util.py
Python
def split_text_on_tokens(text: str, text_token: int, chunk_size=800, chunk_overlap=100) -> List[str]:
"""Split incoming text and return chunks using tokenizer."""
# calculate the number of characters represented by each token.
char_per_token = len(text) / text_token
chunk_char_size = int(chunk_size * char_per_token)
chunk_char_overlap = int(chunk_overlap * char_per_token)
result = []
current_position = 0
while current_position + chunk_char_overlap < len(text):
if current_position + chunk_char_size >= len(text):
chunk = text[current_position:]
else:
chunk = text[current_position:current_position + chunk_char_size]
result.append(chunk)
current_position += chunk_char_size - chunk_char_overlap
if len(result) == 0:
result.append(text[current_position:])
return result
split_texts(texts, llm, chunk_size=800, chunk_overlap=100, retry=True)
¶
split texts into chunks with the fixed token length -- general method
Source code in agentuniverse/base/util/prompt_util.py
Python
def split_texts(texts: list[str], llm: LLM, chunk_size=800, chunk_overlap=100, retry=True) -> list[str]:
"""
split texts into chunks with the fixed token length -- general method
"""
try:
split_texts_res = []
for text in texts:
text_token = llm.get_num_tokens(text)
split_texts_res.extend(
split_text_on_tokens(text=text, text_token=text_token, chunk_size=chunk_size,
chunk_overlap=chunk_overlap))
return split_texts_res
except Exception as e:
if retry:
return split_texts(texts=texts, llm=llm, retry=False)
raise ValueError("split text failed, exception=" + str(e))
summarize_by_map_reduce(texts, llm, summary_prompt, combine_prompt)
¶
map reduce summarization -- general method
Source code in agentuniverse/base/util/prompt_util.py
Python
def summarize_by_map_reduce(texts: List[str], llm: LLM, summary_prompt, combine_prompt):
"""
map reduce summarization -- general method
"""
map_reduce_chain = load_summarize_chain(llm.as_langchain(), chain_type='map_reduce', verbose=True,
map_prompt=summary_prompt.as_langchain(),
combine_prompt=combine_prompt.as_langchain())
return map_reduce_chain.run([Document(page_content=text) for text in texts])
summarize_by_stuff(texts, llm, summary_prompt)
¶
stuff summarization -- general method
Source code in agentuniverse/base/util/prompt_util.py
Python
def summarize_by_stuff(texts: List[str], llm: LLM, summary_prompt):
"""
stuff summarization -- general method
"""
stuff_chain = load_summarize_chain(llm.as_langchain(), chain_type='stuff', verbose=True,
prompt=summary_prompt.as_langchain())
return stuff_chain.run([Document(page_content=text) for text in texts])
truncate_content(content, token_length, llm)
¶
truncate the content based on the llm token limit