在B站学习 图灵程序员-诸葛 的LangChain入门课程《深度定制本地工具》。在实践Chain.as_tool代码的时候,程序的运行逻辑让我困惑了好一会儿,写文章记录一下这个有趣的点。下面是代码,主要示意了如何构建自己的chain作为tool来用英语回答的问题。

from langchain_core.output_parsers import StrOutputParser  
from langchain_core.prompts import ChatPromptTemplate  
from langchain_openai import ChatOpenAI  
  
llm = ChatOpenAI(  
    model="qwen-plus",  
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",  
    api_key="[Your API KEY]"  
)  
  
prompt = ChatPromptTemplate.from_messages(["human", "把{sentence}翻译成{language}"])  
parser = StrOutputParser()  

chain = prompt | llm | parser  
as_tool = chain.as_tool(name="translatetool", description="翻译工具")  

all_tools = {"translatetool": as_tool}  
print(as_tool.args)  
llm_with_tools = llm.bind_tools([as_tool])  

query = "如何用英语回复这句话“今天天气真冷”?要求使用更随意的表达方式。"  
messages = [query]  

ai_msg = llm_with_tools.invoke(messages)  
print(f"Message from LLM: {ai_msg}")  
messages.append(ai_msg)  

if ai_msg.tool_calls:  
    for tool_call in ai_msg.tool_calls:  
        selected_tool = all_tools[tool_call["name"].lower()]  
        tool_msg = selected_tool.invoke(tool_call)  
        print(f"Message from tool: {tool_msg}")  
        messages.append(tool_msg)  
  
result = llm_with_tools.invoke(messages).content  
print(result)

代码运行的结果确实是期待的,实际效果是

  • 用户向AI提出问题:如何用英语回复这句话“今天天气真冷”?要求使用更随意的表达方式。
  • AI回答:你可以用英语这样随意地表达“今天天气真冷”: "It's freezing today!" 或者 "Man, it's cold out here today!" 这些表达方式更口语化和随意。

我脑海中的程序执行逻辑是

  1. 根据用户提问,大模型给出答复,比如”确实,都冻僵了“或”是啊,今天真是太冷了“。这里的答复是中间结果。
  2. 然后大模型调用代码里的chain来翻译作为中间结果后给出用户英语版本的答复。

但代码运行日志如下

{'language': {'title': 'Language', 'type': 'string'}, 'sentence': {'title': 'Sentence', 'type': 'string'}}
Message from LLM: content='' additional_kwargs={'tool_calls': [{'id': 'call_abe466af849040adb44d48', 'function': {'arguments': '{"language": "en", "sentence": "今天天气真冷"}', 'name': 'translatetool'}, 'type': 'function', 'index': 0}], 'refusal': None} response_metadata={'token_usage': {'completion_tokens': 28, 'prompt_tokens': 196, 'total_tokens': 224, 'completion_tokens_details': None, 'prompt_tokens_details': {'audio_tokens': None, 'cached_tokens': 0}}, 'model_name': 'qwen-plus', 'system_fingerprint': None, 'id': 'chatcmpl-9bd057b0-705b-9ed5-86e0-171993e7a1e7', 'finish_reason': 'tool_calls', 'logprobs': None} id='run-e516fb4e-3844-49ce-bf9e-37ad3710fe49-0' tool_calls=[{'name': 'translatetool', 'args': {'language': 'en', 'sentence': '今天天气真冷'}, 'id': 'call_abe466af849040adb44d48', 'type': 'tool_call'}] usage_metadata={'input_tokens': 196, 'output_tokens': 28, 'total_tokens': 224, 'input_token_details': {'cache_read': 0}, 'output_token_details': {}}
Message from tool: content="It's really cold today." name='translatetool' tool_call_id='call_abe466af849040adb44d48'
你可以用英语这样随意地表达“今天天气真冷”: "It's freezing today!" 或者 "Man, it's cold out here today!" 这些表达方式更口语化和随意。

从日志看出来,实际程序的执行逻辑是

  1. 大模型先调用代码里的chain把“今天天气真冷”翻译成了“It's really cold today.”。
  2. 之后大模型用英语做了回复。

看出来程序实际执行的逻辑和我设想的完全不同。大模型的逻辑是先把用户的提问翻译为英语,然后在英语的思维里作答,细想确实更加合理。如果先用中文思路作答,从大模型得到类似“你妈喊你穿秋裤了吗?”的答复,再翻译成英语就有点哭笑不得了。

本文由博客一文多发平台 OpenWrite 发布!

人月新话
1 声望0 粉丝