ITPub博客

首页 > 数据库 > 数据库开发技术 > 【吃瓜】9.11和9.9哪个大?来看看大佬是怎么解决这个问题的!

【吃瓜】9.11和9.9哪个大?来看看大佬是怎么解决这个问题的!

原创 数据库开发技术 作者:AI技术研习社 时间:2024-07-17 08:15:00 0 删除 编辑

昨天流传一张图很经典,都没眼看了……9.11和9.9哪个大?,这样简单的问题,大模型居然都翻车了!!!

如下图,网友的测试记录:

哈哈,吃瓜群众们,瓜吃得差不多了,该干活了!作为技术人,咱们可不能让大模型在比较两个数大小这种简单问题上掉链子。为了避免大模型犯这种低级错误,我们需要采取一系列技术措施来确保模型的准确性。

能想到的有以下几点,如果你有更好的点子,记得留言哦!

  • 使用function call解决

  • 使用langchain的链解决

  • 使用Agent解决

  • 使用微调技术


下面,我们依次来介绍以下具体技术的原理和使用:

1. 使用function call解决

大语言模型的function call(函数调用)功能是指模型能够解释和执行嵌入在输入文本中的函数调用指令。这种功能使得大语言模型不仅仅局限于生成文本,还可以执行更复杂的操作,如调用API、执行计算、获取实时数据等。

Function Call的实现原理

  1. 识别函数调用指令:

  • 解析输入文本: 模型首先需要能够识别输入文本中的函数调用指令。这通常涉及自然语言理解(NLU)技术,模型可以从上下文中识别特定的调用模式或关键词。

  • 函数格式识别: 例如,输入文本可能包含类似于“calculate(5, 10)”或“get_weather('New York')”的指令,模型需要能够正确解析这些调用格式。

  • 映射到实际函数:

    • 函数库映射: 一旦识别出函数调用指令,模型需要将其映射到预定义的函数库中的具体函数。这些函数可以是预先定义好的,也可以是通过扩展接口动态加载的。

    • 参数处理: 模型需要从指令中提取参数,并将这些参数传递给相应的函数。例如,从“calculate(5, 10)”中提取参数5和10,并传递给对应的计算函数。

  • 函数执行:

    • 调用实际函数: 模型通过编程接口或嵌入的执行环境调用实际的函数,并获得返回值。例如,通过调用API或执行嵌入的脚本来获取结果。

    • 处理返回结果: 函数执行后,模型需要处理返回结果,并将其整合到生成的文本中。例如,将计算结果或API返回的数据嵌入到回复中。

  • 生成响应:

    • 整合结果: 模型将函数调用的结果整合到最终的输出文本中,生成包含计算结果或外部数据的回复。

    • 自然语言生成: 使用自然语言生成技术(NLG)确保整合后的回复自然流畅,符合上下文要求。

    应用示例

    1. 计算功能:

    • 输入: “What is the result of calculate(5, 10)?”

    • 处理: 模型识别出“calculate(5, 10)”为函数调用,调用相应的计算函数并获得结果15。

    • 响应: “The result of calculate(5, 10) is 15.”

  • API 调用:

    • 输入: “What is the current weather in New York?”

    • 处理: 模型识别出需要调用天气API,格式化API请求并获取实时天气数据。

    • 响应: “The current weather in New York is 25°C with clear skies.”

  • 数据库查询:

    • 输入: “How many users signed up last week?”

    • 处理: 模型识别需要查询数据库,执行相应的SQL查询并获得结果。

    • 响应: “Last week, 150 users signed up.”


    下面是一个示例,展示如何使用一个预训练的大语言模型(例如OpenAI的GPT-3或GPT-4)来实现一个函数调用功能,用于比较两个数的大小。在这个示例中,我们将模拟一个虚拟的函数调用,通过解析输入字符串并调用实际的比较函数。

    import openai
    # 假设我们有一个OpenAI的API密钥openai.api_key = 'your-api-key-here'
    def compare_numbers(a, b): """ 比较两个数的大小。
    参数: a (int or float): 第一个数 b (int or float): 第二个数
    返回: str: 比较结果的字符串描述 """ if a > b: return f"{a} is greater than {b}" elif a < b: return f"{a} is less than {b}" else: return f"{a} is equal to {b}"
    def function_call(prompt): """ 模拟大模型的函数调用,解析输入并调用实际函数。
    参数: prompt (str): 输入提示,包含函数调用指令
    返回: str: 函数调用的结果 """ # 解析输入提示,假设格式为 "compare_numbers(a, b)" if "compare_numbers(" in prompt: try: # 提取参数 params = prompt.split("compare_numbers(")[1].split(")")[0] a, b = map(float, params.split(",")) # 调用实际的比较函数 result = compare_numbers(a, b) return result except Exception as e: return f"Error parsing input: {e}" else: return "Function not recognized."
    # 示例使用大语言模型接口def use_model_for_function_call(prompt): """ 使用大语言模型接口来处理函数调用。
    参数: prompt (str): 输入提示,包含函数调用指令
    返回: str: 模型生成的结果 """ response = openai.Completion.create( engine="text-davinci-003", # 使用适当的模型引擎 prompt=prompt, max_tokens=50 ) return response.choices[0].text.strip()
    # 主程序if __name__ == "__main__": # 示例输入 prompt = "compare_numbers(10, 5)" # 直接调用函数 print("Direct function call result:") print(function_call(prompt)) # 使用大语言模型进行函数调用 print("\nUsing model for function call result:") model_prompt = f"Please call the following function: {prompt}" model_output = use_model_for_function_call(model_prompt) print(model_output)

    2. 使用langchain的链解决

    LangChain 是一个用于构建语言模型应用的强大框架,可以帮助我们简化与预训练语言模型的集成。下面是一个示例,展示如何使用 LangChain 来实现一个比较两个数大小的功能。

    接下来,我们将使用 LangChain 来实现一个功能,用于比较两个数的大小。

    from langchain import LLMChain, PromptTemplate, OpenAI
    # 配置OpenAI API密钥openai.api_key = 'your-api-key-here'
    # 定义函数比较两个数def compare_numbers(a, b): """ 比较两个数的大小。
    参数: a (int or float): 第一个数 b (int or float): 第二个数
    返回: str: 比较结果的字符串描述 """ if a > b: return f"{a} is greater than {b}" elif a < b: return f"{a} is less than {b}" else: return f"{a} is equal to {b}"
    # 定义 LangChain 提示模板prompt_template = """You are an assistant who compares two numbers and tells which one is greater or if they are equal.Given the function call: compare_numbers({a}, {b})"""
    # 创建 LangChain 的 PromptTemplateprompt = PromptTemplate(input_variables=["a", "b"], template=prompt_template)
    # 创建 OpenAI 接口的 LLMChainllm = OpenAI(model="text-davinci-003") # 使用适当的模型引擎chain = LLMChain(prompt_template=prompt, llm=llm)
    # 函数,用于调用 LangChaindef function_call_with_langchain(a, b): """ 使用 LangChain 调用比较两个数的函数。
    参数: a (int or float): 第一个数 b (int or float): 第二个数
    返回: str: 比较结果的字符串描述 """ # 调用 LangChain 生成结果 result = chain.run({"a": a, "b": b}) return result.strip()
    # 主程序if __name__ == "__main__": # 示例输入 a = 10 b = 5 # 直接调用函数 print("Direct function call result:") print(compare_numbers(a, b)) # 使用 LangChain 进行函数调用 print("\nUsing LangChain for function call result:") langchain_result = function_call_with_langchain(a, b) print(langchain_result)

    3. 使用Agent解决

    下面是一个简单的示例,展示如何使用 LangChain 构建一个 Agent 来实现比较两个数大小的功能。

    from langchain import LLMChain, PromptTemplate, OpenAIfrom langchain.agents import initialize_agent, Toolfrom langchain.agents.agent_types import AgentType
    # 配置OpenAI API密钥openai.api_key = 'your-api-key-here'
    # 定义比较函数def compare_numbers(a: float, b: float) -> str: """ 比较两个数的大小。
    参数: a (float): 第一个数 b (float): 第二个数
    返回: str: 比较结果的字符串描述 """ if a > b: return f"{a} is greater than {b}" elif a < b: return f"{a} is less than {b}" else: return f"{a} is equal to {b}"
    # 创建一个工具,用于调用比较函数compare_tool = Tool( name="compare_numbers", func=compare_numbers, description="Compares two numbers and returns which one is greater or if they are equal.")
    # 初始化OpenAI的LLMllm = OpenAI(model="text-davinci-003")
    # 创建一个Prompt模板prompt_template = """You are an assistant who compares two numbers and tells which one is greater or if they are equal.Given the numbers: {a} and {b}"""
    # 创建LangChain的PromptTemplateprompt = PromptTemplate(input_variables=["a", "b"], template=prompt_template)
    # 创建LangChain的LLMChainchain = LLMChain(prompt_template=prompt, llm=llm)
    # 初始化Agentagent = initialize_agent( tools=[compare_tool], llm=llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
    # 主程序if __name__ == "__main__": # 示例输入 a = 10 b = 5
    # 使用Agent进行函数调用 prompt = f"compare_numbers({a}, {b})" result = agent.run(prompt) print("Agent result:") print(result)

    4. 使用微调技术

    为了使用微调技术让大模型比较两个数的大小,我们需要以下步骤:

    1. 准备数据:生成或收集大量的训练数据,包含两个数及其比较结果。

    2. 数据预处理:将数据转换为模型可以接受的格式。

    3. 微调模型:使用包含标注数据的预训练模型进行微调。

    4. 评估和验证:评估微调后的模型性能。

    这里我们将使用Hugging Face的Transformers库,它提供了便捷的API来进行模型微调和使用。

    首先,我们生成一些训练数据。每条数据包含两个数以及它们的比较结果。

    import randomimport json
    def generate_data(num_samples): data = [] for _ in range(num_samples): a = random.uniform(-100, 100) # 生成随机数 b = random.uniform(-100, 100) if a > b: label = f"{a} is greater than {b}" elif a < b: label = f"{a} is less than {b}" else: label = f"{a} is equal to {b}" data.append({"input": f"compare_numbers({a}, {b})", "label": label}) return data
    # 生成 1000 条训练数据train_data = generate_data(1000)
    # 保存为 JSON 文件with open("train_data.json", "w") as f: json.dump(train_data, f)

    使用 datasets 库来加载和预处理数据。

    from datasets import load_dataset
    # 加载数据集dataset = load_dataset('json', data_files='train_data.json')
    # 打印部分数据print(dataset['train'][0])

    使用 transformers 库来微调预训练模型。

    from transformers import AutoTokenizer, AutoModelForSequenceClassification, Trainer, TrainingArguments
    # 加载预训练的 tokenizertokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
    # 数据预处理函数def preprocess_function(examples): return tokenizer(examples['input'], truncation=True, padding='max_length', max_length=128)
    # 应用数据预处理tokenized_dataset = dataset.map(preprocess_function, batched=True)
    # 加载预训练的模型model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=3)
    # 定义训练参数training_args = TrainingArguments( output_dir="./results", evaluation_strategy="epoch", per_device_train_batch_size=8, per_device_eval_batch_size=8, num_train_epochs=3, weight_decay=0.01, logging_dir="./logs",)
    # 定义 Trainertrainer = Trainer( model=model, args=training_args, train_dataset=tokenized_dataset["train"], eval_dataset=tokenized_dataset["train"],)
    # 开始微调trainer.train()

    微调完成后,我们可以使用模型来比较两个数的大小。

    from transformers import pipeline
    # 加载微调后的模型model_path = "./results"classifier = pipeline("text-classification", model=model_path, tokenizer=tokenizer)
    # 测试比较函数def compare_numbers_with_model(a, b): input_text = f"compare_numbers({a}, {b})" result = classifier(input_text) return result[0]['label']
    # 测试a = 10b = 5result = compare_numbers_with_model(a, b)print(f"Comparison result: {result}")

    通过上述步骤,我们使用微调技术让大模型能够比较两个数的大小。这个过程包括准备和生成训练数据、数据预处理、模型微调和测试模型。通过微调预训练模型,我们可以让模型适应特定任务(如比较两个数的大小),从而提高模型在该任务上的性能。

    哈哈,看完这篇文章,大家有没有感觉到技术的奇妙和幽默的碰撞?如果你还有更好的点子,或者在实践中遇到什么有趣的问题,不要犹豫,赶快留言告诉我们吧!技术的进步离不开大家的互动和分享,让我们一起在这个技术瓜田里,吃好每一口瓜,解决每一个问题!期待你的创意和反馈哦!🍉🚀

    长按下图前往本公众号领取更多学习资料:

    原文作者:AI技术研习社;如有侵权,请联系管理员删除。

    请登录后发表评论 登录
    全部评论

    注册时间:2020-06-22

    • 博文量
      118
    • 访问量
      66437