-
Notifications
You must be signed in to change notification settings - Fork 833
[model] support glm-4.5 agent #5305
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Summary of Changes
Hello @laocheyujie, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!
I've implemented support for GLM-4.5 agent training, specifically enabling function call capabilities within the ms-swift
project. This involved integrating a new agent template and refining the text generation process to ensure more accurate and efficient output by preventing redundant suffixes. The changes aim to expand the framework's compatibility with advanced large language models and their interactive features.
Highlights
- GLM-4.5 Agent Support: I've added comprehensive support for GLM-4.5 agent (function call) training within the
ms-swift
framework. This includes defining a new template and agent-specific logic for GLM-4.5 agents. - Suffix Appending Logic Enhancement: I've refined the suffix appending logic during the final generation round. The system now checks if the output already ends with a stop word, preventing redundant suffix additions and improving output quality.
Using Gemini Code Assist
The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.
Invoking Gemini
You can request assistance from Gemini at any point in your pull request via creating an issue comment (i.e. comment on the pull request page) using either /gemini <command>
or @gemini-code-assist <command>
. Below is a summary of the supported commands.
Feature | Command | Description |
---|---|---|
Code Review | /gemini review |
Performs a code review for the current pull request in its current state. |
Pull Request Summary | /gemini summary |
Provides a summary of the current pull request in its current state. |
Comment | @gemini-code-assist | Responds in comments when explicitly tagged, both in issue comments and review comments. |
Help | /gemini help |
Displays a list of available commands. |
Customization
To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/
folder in the base of the repository. Detailed instructions can be found here.
Limitations & Feedback
Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments or fill out our survey to provide feedback.
You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.
Footnotes
-
Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution. ↩
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code Review
This pull request adds support for the GLM-4.5 agent, including a new agent template and updates to the suffix appending logic. The changes are well-structured and address the goal of the PR. I've provided a few suggestions to improve code clarity, style, and performance.
swift/llm/template/base.py
Outdated
@@ -1135,7 +1135,8 @@ def _swift_encode(self, inputs: StdTemplateInputs): | |||
context_list.append('{{RESPONSE}}') | |||
# self.is_training needed because we may want to continue generation from | |||
# the current response | |||
if self.is_training and not sep_token or self.task_type == 'embedding': | |||
string_stop_words = tuple(s for s in template_meta.stop_words if isinstance(s, str)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What is the reason for this modification here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Originally, I made that change to prevent models like GLM-4.5 from producing <|observation|><|user|>
when the final round was a tool_call. But I just realized this can be handled more cleanly by overriding _swift_encode
in the GLM4_5Template
class, so I removed that part of the modification in my latest commit.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hello!
Here, <|user|>
(suffix) is only added during training. Could you please clarify: in what training scenarios would the final round include <|observation|>
but not tool_response?
Hello, please run the following code to pass the lint test.
|
/gemini review |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code Review
This pull request introduces support for GLM-4.5 agent function call training. The changes include a new GLM4_5AgentTemplate
for handling the specific tool call format of GLM-4.5, along with corresponding template metadata. The logic for suffix appending is also enhanced to prevent redundant tokens. The implementation is well-structured and follows existing patterns in the codebase. I've identified a few areas for improvement regarding code robustness and readability in the new agent template implementation.
for arg_key, arg_value in tool_call['arguments'].items(): | ||
tool_calls.append(f'<arg_key>{arg_key}</arg_key>\n<arg_value>{arg_value}</arg_value>') |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The code assumes that tool_call['arguments']
is always a dictionary, which may not be guaranteed by _parse_tool_call
. If arguments
is not a dictionary, tool_call['arguments'].items()
will raise a runtime error. It's safer to check if arguments
is a dictionary before iterating over it to make the function more robust against malformed inputs.
for arg_key, arg_value in tool_call['arguments'].items(): | |
tool_calls.append(f'<arg_key>{arg_key}</arg_key>\n<arg_value>{arg_value}</arg_value>') | |
arguments = tool_call.get('arguments') | |
if isinstance(arguments, dict): | |
for arg_key, arg_value in arguments.items(): | |
tool_calls.append(f'<arg_key>{arg_key}</arg_key>\n<arg_value>{arg_value}</arg_value>') |
functions = [] | ||
for toolcall in toolcall_list: | ||
function = self._find_function_call(toolcall) | ||
if function: | ||
functions.append(function) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The loop for collecting functions can be made more concise and Pythonic by using a list comprehension with a walrus operator (PEP 572). This can improve readability and reduce boilerplate code.
functions = [] | |
for toolcall in toolcall_list: | |
function = self._find_function_call(toolcall) | |
if function: | |
functions.append(function) | |
functions = [func for toolcall in toolcall_list if (func := self._find_function_call(toolcall))] |
if with_action: | ||
return super()._format_tool_responses(assistant_content, tool_messages) | ||
res = [] | ||
for _, tool_message in enumerate(tool_messages): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
PR type
PR information
This PR adds support for GLM-4.5 agent (function call) training in ms-swift.
Key updates:
Experiment results