掘金 人工智能 04月27日 17:42
AI翻译LangChain实现的一点思考
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文记录了在B站学习图灵程序员-诸葛的LangChain入门课程时,作者在实践Chain.as_tool代码时遇到的程序运行逻辑困惑。文章通过代码示例展示了如何构建自定义的chain作为工具来回答问题,并详细分析了实际运行日志与作者预期逻辑的差异。最终,作者发现大模型在处理问题时,会先将用户提问翻译成目标语言,再进行解答,这种逻辑更加合理,避免了翻译可能带来的问题。

💡**代码示例与工具构建**: 文章首先展示了如何使用LangChain构建一个翻译工具(Chain),该工具可以将中文句子翻译成英文。通过`as_tool`方法,将Chain转化为可供大模型调用的工具。

🤔**运行逻辑的差异**: 作者原以为大模型会先用中文回答问题,再调用翻译工具。但实际运行日志显示,大模型首先调用翻译工具将问题翻译成英文,然后用英文给出回答,这与作者的预期不同。

🧐**大模型的处理流程**: 实际的执行逻辑是,大模型接收到用户提问后,会先调用翻译工具将问题翻译成英文,然后用英文进行思考和回答。这种方式避免了先用中文回答,再翻译成英文可能导致的问题,使得逻辑更加合理。

✅**更合理的解决方案**: 作者通过实践发现,大模型在处理多语言问题时,会优先将问题转化为目标语言,并在目标语言环境下进行思考和回答,这是一种更高效、更准确的解决方案。

在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)

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

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

    根据用户提问,大模型给出答复,比如”确实,都冻僵了“或”是啊,今天真是太冷了“。这里的答复是中间结果。然后大模型调用代码里的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 发布!

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

LangChain 工具 大模型 翻译 AI逻辑
相关文章