MirrorYuChen
MirrorYuChen
Published on 2025-03-23 / 11 Visits
0
0

Qwen_Agent源码解析(三):Asistant类

Qwen_Agent源码解析(三):Asistant类

1.初始化接口

  • (1) 参数解析
参数 参数描述
function_list 智能体能调用工具列表
llm 大语言模型配置或大语言模型实例
system_message 系统提示词
name 智能体名
description 智能体描述
files 知识库文件列表
rag_cfg rag配置信息
  • (2) 源码解析:调用父类FnCallAgent的初始化方法完成初始化。
    def __init__(self,
                 function_list: Optional[List[Union[str, Dict, BaseTool]]] = None,
                 llm: Optional[Union[Dict, BaseChatModel]] = None,
                 system_message: Optional[str] = DEFAULT_SYSTEM_MESSAGE,
                 name: Optional[str] = None,
                 description: Optional[str] = None,
                 files: Optional[List[str]] = None,
                 rag_cfg: Optional[Dict] = None):
        # 1.初始化父类FnCallAgent
        super().__init__(function_list=function_list,
                         llm=llm,
                         system_message=system_message,
                         name=name,
                         description=description,
                         files=files,
                         rag_cfg=rag_cfg)

2.重写父类的内部运行方法

  • (1) 参数解析
参数 参数描述
messages 传入的消息队列
lang 传入消息的语言类型
knowledge 要附加到系统提示中的外部知识
  • (2) 代码解析:
def _run(self,
             messages: List[Message],
             lang: Literal['en', 'zh'] = 'en',
             knowledge: str = '',
             **kwargs) -> Iterator[List[Message]]:
        """Q&A with RAG and tool use abilities.

        Args:
            knowledge: If an external knowledge string is provided,
              it will be used directly without retrieving information from files in messages.

        """
        # 1.将外部知识附加到系统提示中
        new_messages = self._prepend_knowledge_prompt(messages=messages, lang=lang, knowledge=knowledge, **kwargs)
        # 2.调用父类FnCallAgent的_run方法
        return super()._run(messages=new_messages, lang=lang, **kwargs)

3.内部附加知识提示方法

  • (1) 参数解析
参数 参数描述
messages 传入消息列表
lang 传入消息的语言类型
knowledge 要附加到系统提示中的外部知识
  • (2) 代码解析:
def _prepend_knowledge_prompt(self,
                                  messages: List[Message],
                                  lang: Literal['en', 'zh'] = 'en',
                                  knowledge: str = '',
                                  **kwargs) -> List[Message]:
        messages = copy.deepcopy(messages)
        # 1.如果没有提供knowledge,则从配置的知识库文件中检索knowledge
        if not knowledge:
            # Retrieval knowledge from files
            *_, last = self.mem.run(messages=messages, lang=lang, **kwargs)
            knowledge = last[-1][CONTENT]

        logger.debug(f'Retrieved knowledge of type `{type(knowledge).__name__}`:\n{knowledge}')
        # 2.格式化knowledge为source和content
        if knowledge:
            knowledge = format_knowledge_to_source_and_content(knowledge)
            logger.debug(f'Formatted knowledge into type `{type(knowledge).__name__}`:\n{knowledge}')
        else:
            knowledge = []
        snippets = []
        # 3.将source和content格式化为知识库提示
        for k in knowledge:
            snippets.append(KNOWLEDGE_SNIPPET[lang].format(source=k['source'], content=k['content']))
        knowledge_prompt = ''
        if snippets:
            knowledge_prompt = KNOWLEDGE_TEMPLATE[lang].format(knowledge='\n\n'.join(snippets))

        # 4.将知识库提示添加到消息队列中
        if knowledge_prompt:
            if messages[0][ROLE] == SYSTEM:
                if isinstance(messages[0][CONTENT], str):
                    messages[0][CONTENT] += '\n\n' + knowledge_prompt
                else:
                    assert isinstance(messages[0][CONTENT], list)
                    messages[0][CONTENT] += [ContentItem(text='\n\n' + knowledge_prompt)]
            else:
                messages = [Message(role=SYSTEM, content=knowledge_prompt)] + messages
        return messages

4,参考资料


Comment