在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!" 这些表达方式更口语化和随意。
我脑海中的程序执行逻辑是
- 根据用户提问,大模型给出答复,比如”确实,都冻僵了“或”是啊,今天真是太冷了“。这里的答复是中间结果。
- 然后大模型调用代码里的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!" 这些表达方式更口语化和随意。
从日志看出来,实际程序的执行逻辑是
- 大模型先调用代码里的chain把“今天天气真冷”翻译成了“It's really cold today.”。
- 之后大模型用英语做了回复。
看出来程序实际执行的逻辑和我设想的完全不同。大模型的逻辑是先把用户的提问翻译为英语,然后在英语的思维里作答,细想确实更加合理。如果先用中文思路作答,从大模型得到类似“你妈喊你穿秋裤了吗?”的答复,再翻译成英语就有点哭笑不得了。
本文由博客一文多发平台 OpenWrite 发布!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。