THUDM / GLM-4

GLM-4 series: Open Multilingual Multimodal Chat LMs | 开源多语言多模态对话模型
Apache License 2.0
5.28k stars 435 forks source link

请问GLM4v9b直接接入langchain的Agent吗? #519

Closed Jimmy-L99 closed 1 month ago

Jimmy-L99 commented 2 months ago

System Info / 系統信息

python3.11.9

Who can help? / 谁可以帮助到您?

No response

Information / 问题信息

Reproduction / 复现过程

想请教一下langchain tool调用,比如我按照langchain文档构建RAG,并将RAG retriever转换成tool。

vector_store = Milvus(
    embedding_function=embedding_model,
    collection_name=collection_name,
    connection_args={"host": milvus_host, "port": milvus_port, "db_name": "db_name"}, 
)
retriever = vector_store.as_retriever(search_type="similarity", search_kwargs={"k": 3})

RAG = create_retriever_tool(
    retriever,
    "工具名称",
    "工具描述",
)
tools = [RAG]
agent_executor = create_react_agent(llm, tools, debug=True)
query = "RAG相关问题"
messages = HumanMessage(content=query) 
langchain_run = agent_executor.invoke({"messages": [messages]})

我的理解是langchain tool需要经过api的process_response,得到function_name和arguments,函数最后得到的function_call是一个json格式的字符串:

{
    "function_name": "工具名称",
    "args": {"query": "RAG相关问题"}
}

最后glm应该输出的消息字典是:

{
    "model": "glm4v-9b",
    "id": "chatcmpl-KJFsyebUZSyHIoalGYUuJYR8Jk2Wl",
    "object": "chat.completion",
    "choices": [
        {
            "index": 0,
            "message": {
                "role": "assistant",
                "content": null,
                "image": null,
                "function_call": null,
                "tool_calls": [
                    {
                        "index": 0,
                        "id": "call_93smoFzRGq1WI0hg4LHw8lA9",
                        "function": {
                            "name": "工具名称",
                            "arguments": "{\"query\": \"RAG相关问题\"}"
                        },
                        "type": "function"
                    }
                ]
            },
            "finish_reason": "tool_calls"
        }
    ],
    "created": 1724982703,
    "system_fingerprint": "fp_K4oWqPfLV",
    "usage": {
        "prompt_tokens": 1190,
        "total_tokens": 2415,
        "completion_tokens": 1225
    }
}

但api_server的process_response函数内容打印如下:

2024-08-30 09:43:44.091 | DEBUG | main:process_response:179 - ==== function_name ====

```json

2024-08-30 09:43:44.091 | DEBUG | main:process_response:181 - ==== arguments ====

{
     "function_name": "工具名称",
     "args": {"query": "RAG相关问题"}
}
```(包括这行)

代码里面的字符串处理貌似没有正确得到function_name和正确arguments格式,所以想请教一下,这里是要自己根据langchain所需格式进行调整? 另外,tool的description作用只是结合handle_single_conversation函数里面加上tool使用方法的提示词,最后让大模型输出tool_calls吗?

Expected behavior / 期待表现

大模型成功调用tool进行回答

zRzRzRzRzRzRzR commented 2 months ago

不太行,fc格式和lc要求的不太一样,这个需要你自行转换(一般是正则或者其他链路)

Jimmy-L99 commented 2 months ago

感谢指教!另外还有个问题想请教一下,对于langchain agent的多工具调用,tools = [RAG, function2, function3],我试过如果只是tools = [RAG],可以正常回答;但是多工具的话,就没法正常触发RAG了,这跟模型能力有关系还是提示词有关?

zRzRzRzRzRzRzR commented 2 months ago

GLM-4没有多工具同时调用的能力,因此只会选择一个

Jimmy-L99 commented 2 months ago

是的,本意是想让它从多个工具里面选一个,测试的时候可以选RAG,但没法给出正常回答了。

zRzRzRzRzRzRzR commented 2 months ago

如果选到了RAG后续不能正常回答吗,其实我建议fc的节点调用模型,非fc的节点,比如RAG总结的节点是另一个LLM