如何用 LangChain 实现一个Zero Shot智能决策器(附源码)

AI逆向工程师学习路线:从爬虫基础到智能Agent实战 在网络安全与数据采集领域,逆向工程是理解系统内部逻辑、分析数据流与协议的关键技术。其核心原理在于通过静态分析与动态调试,解析软件或网络应用的行为机制,从而复现或绕过其限制。随着AI大模型的兴起,传统逆向技术正与智能体(Agent)深度融合,催生出新一代技术范式。AI能够辅助工程师快速理解混淆代码、生成解密函数,甚至构建自适应网站变化的智能爬虫Agent,极大提升了逆向分析与数据采集的效率和智能化水平。这种融合技术尤其适用于复杂反爬策略应对、自动化安全测试及大规模数据采集等场景,为工程师提供了从基础爬虫到AI 阅读详情

写在前面

最近一直在研究Agent和Tool的使用,今天给大家带来一篇何枝大佬(知乎@何枝)的文章《如何用LangChain实现一个Zero Shot智能决策器》,并附上源码。

知乎:https://zhuanlan.zhihu.com/p/627333499

LangChain是当下非常热门的一个库,其通过融合LLM的强大能力能够让我们快速地搭建一个具备 “思考能力” 的AI助手。在今天的文章中,我们将侧重于讲解:LangChain是如何进行自我思考并做出决策的。

Github:https://github.com/hwchase17/langchain
官方文档:LangChain 0.0.160

假设今天我们有一个朋友过生日,你很头疼,你不知道送什么礼物给他。这时候,你希望有一个机器人能告诉你一些推荐,如何实现这样一个机器人呢?

1. 人在分析问题时候的思维

如果今天需要你自己去思考送什么礼物,你可能会这么想:

  • 我这个朋友是女生。
  • 女生可能会喜欢一些口红、护肤品等等。
  • 好!那我就送她一只口红吧!

可以看出,人们在得到一个问题的最终答案前,通常是会有若干个「中间步骤(intermediate steps)」,LangChain 也是这样!在人们给出一个问题后,LangChain会引导LLM进行一步一步的分析,最终得到一个确定的答案。

下面,我们就将使用 LangChain + ChatGPT 来复现上述的思考步骤。当我们问两个不同的朋友时,模型会给出不同的推荐礼物:

朋友1

  • User:帮我推荐几个送给小红的礼物
  • Model:为小红推荐的礼物有:夏季碎花裙、轻盈帆布包、琉璃唇釉。

朋友2

  • User:我想送点礼物给张三
  • Model:根据张三的性别和兴趣,我可以推荐Steam爆款、RTX-3090或iPhone 14作为礼物。

2. 思维链中的工具设计

我们先分析一下,上述思维链中一共需要两个功能:

  • 找出人物的性别(张三是男的,小红是女生)
  • 根据人物的性别推荐对应的商品(男生喜欢数码产品,女生喜欢化妆品)

尽管LLM本身就存在一定的性别推理、商品推荐的能力,但为了更好的利用本地的数据,LangChain 提供了Tool类,能够更方便我们使用本地数据,以便于更好的对齐业务需求。图片

我们可以通过以下方式来定义这两个工具:

from langchain.agents import Tool


def find_gender(name: str):
    """
    模拟本地数据库查询。

    Args:
        name (str): 人物名称,由LLM提取。

    Returns:
        _type_: _description_
    """
    info = {                     # 模拟数据库,存放人物对应的性别
        '张三': '男',
        '小红': '女'
    }
    return info.get(name, f'未找到{name}的性别信息,我应该直接返回 Observation: 未知')

tool_of_find_gender = Tool(
    name = "查询人物性别",                         # 工具的名称
    func=find_gender,                            # 工具的实现函数
    description="通过人名查找该人物的性别时用的工具,输入应该是人物的名字"   # 【重要】描述工具的用途,LLM 会根据描述来决定是否使用这个工具
)


def recommend_item(gender: str):
    """
    根据人物性别推荐不同的商品。

    Args:
        gender (str): 人物的性别,由 LLM 提取。

    Returns:
        _type_: _description_
    """
    recommend = {
        '男': ['Steam爆款', 'RTX-9090', 'iPhone 80'],
        '女': ['夏季碎花裙', '轻盈帆布包', '琉璃唇釉'],
        '未知': ['AJ新品', '手冲咖啡']
    }
    return recommend.get(gender, f'未找到合适的推荐商品,我应该返回 Final Answer: 随便买些什么吧,只要消费就能快乐!')

tool_of_recommend_item = Tool(
    name = "根据性别推荐商品",
    func=recommend_item,
    description="当知道了一个人性别后想进一步获得他可能感兴趣的商品时用的工具,输入应该是人物的性别"
)

其中,description和name非常重要,这将帮助LLM参考在何时应该调用这个工具。

3. 思维链的 Prompt 设计

在有了工具后,我们就要正式开始引导模型进行分析了。

首先我们定义整个 prompt 模板:

"""
按照给定的格式回答以下问题。
你可以使用下面这些工具:

{tools}

回答时需要遵循以下用---括起来的格式:

---
Question: 我需要回答的问题
Thought: 回答这个上述我需要做些什么
Action: ”{tool_names}“ 中的其中一个工具名
Action Input: 选择工具所需要的输入
Observation: 选择工具返回的结果
...(这个思考/行动/行动输入/观察可以重复N次)
Thought: 我现在知道最终答案
Final Answer: 原始输入问题的最终答案
---

现在开始回答,记得在给出最终答案前多按照指定格式进行一步一步的推理。

Question: {input}
{agent_scratchpad}
"""

这个模版中,最重要的是:

  • Thought
  • Action
  • Action Input

这3个部分是AI在思维链中进行自我思考的过程,我们可以直观来看看 LLM 具体是怎么思考的:

>>> 按照给定的格式回答以下问题,你可以使用下面这些工具:

查询人物性别: 通过人名查找该人物的性别时用的工具,输入应该是人物的名字
根据性别推荐商品: 当知道了一个人性别后想进一步获得他可能感兴趣的商品时用的工具,输入应该是人物的性别

回答时需要遵循以下用---括起来的格式:

---
Question: 我需要回答的问题
Thought: 回答这个上述我需要做些什么
Action: ”查询人物性别, 根据性别推荐商品“ 中的其中一个工具名
Action Input: 选择工具所需要的输入
Observation: 选择工具返回的结果
...(这个思考/行动/行动输入/观察可以重复N次)
Thought: 我现在知道最终答案
Final Answer: 原始输入问题的最终答案
---

现在开始回答,记得在给出最终答案前多按照指定格式进行一步一步的推理。

Question: 我想送点礼物给张三


LLM Output >>> Thought: 我需要知道张三的性别,才能更好地推荐礼物          # 模型的第一次输出
Action: 查询人物性别
Action Input: 张三

现在开始回答,记得在给出最终答案前多按照指定格式进行一步一步的推理。

Question: 我想送点礼物给张三


LLM Output >>> Thought: 我需要知道张三的性别,才能更好地推荐礼物          # 模型的第一次输出
Action: 查询人物性别
Action Input: 张三

可以看到,模型进行了第一次思考,它认为解决这个问题首先需要 “确定人物性别”。

而模型之所以能够想到先 “确认性别”,其实是因为我们在 prompt 的最开始告诉了模型:

你可以使用下面这些工具:
查询人物性别: 通过人名查找该人物的性别时用的工具,输入应该是人物的名字
...

模型通过可用工具的描述来推测出自己当前应该怎么决策,所以文章前面也有提到:工具名+工具描述非常的重要!

现在,模型已经决定了要调用 find_gender 函数(Action),并且决定了函数的输入(Action Input)为「张三」,那么,LangChain 就会调用 find_gender(“张三”) 这个函数,得到结果为:男。

于是,我们的 prompt 模板就需要更新啦:

>>> 照给定的格式回答以下问题,你可以使用下面这些工具:

查询人物性别: 通过人名查找该人物的性别时用的工具,输入应该是人物的名字
根据性别推荐商品: 当知道了一个人性别后想进一步获得他可能感兴趣的商品时用的工具,输入应该是人物的性别

回答时需要遵循以下用---括起来的格式:

---
Question: 我需要回答的问题
Thought: 回答这个上述我需要做些什么
Action: ”查询人物性别, 根据性别推荐商品“ 中的其中一个工具名
Action Input: 选择工具所需要的输入
Observation: 选择工具返回的结果
...(这个思考/行动/行动输入/观察可以重复N次)
Thought: 我现在知道最终答案
Final Answer: 原始输入问题的最终答案
---

现在开始回答,记得在给出最终答案前多按照指定格式进行一步一步的推理。

Question: 我想送点礼物给张三

Thought: 我需要知道张三的性别,才能更好地推荐礼物       # 新添加的内容,这部分内容会随着思考不断增加
Action: 查询人物性别                               # 上一步使用的工具
Action Input: 张三                                # 上一步使用工具的输入
Observation: 男                                  # 上一步使用工具后得到的结果
Thought:

可以看到,在模板的最后添加了上一步模型思考的内容(Thought)、调用的工具(Action)、以及调用工具得到的结果(Observation)。

现在我们知道「性别」了,让模型接着往下思考吧:

>>> 照给定的格式回答以下问题,...
...
Thought: 我需要知道张三的性别,才能更好地推荐礼物       # 新添加的内容,这部分内容会随着思考不断增加
Action: 查询人物性别                               # 上一步使用的工具
Action Input: 张三                                # 上一步使用工具的输入
Observation: 男                                  # 上一步使用工具后得到的结果
Thought:

LLM Output >>> 现在我知道了张三的性别,我可以根据性别推荐商品   # 接着上面的 prompt 做续写
Action: 根据性别推荐商品
Action Input: 男

模型现在决定调用 recommend_item() 函数,并且决定函数输入为「男」,调用函数 recommend_item(‘男’) 得到推荐结果:[‘Steam爆款’, ‘RTX-9090’, ‘iPhone 80’]

随后更新 prompt 模版,并喂给模型进行下一步决策:

>>> 按照给定的格式回答以下问题。你可以使用下面这些工具:
...
现在开始回答,记得在给出最终答案前多按照指定格式进行一步一步的推理。

Question: 我想送点礼物给张三
Thought: 我需要知道张三的性别,才能更好地推荐礼物

Action: 查询人物性别
Action Input: 张三
Observation: 男
Thought: 现在我知道了张三的性别,我可以根据性别推荐商品

Action: 根据性别推荐商品
Action Input: 男
Observation: ['Steam爆款', 'RTX-9090', 'iPhone 80']
Thought: 

LLM Output >>> 现在我知道了可以推荐给张三的礼物,我可以给他送一个             # 模型根据已有的历史记录,得出了最终答案
Final Answer: 我可以给张三送一个Steam爆款、RTX-9090或者iPhone 80作为礼物。

现在已经得到足够多的信息,模型认为可以输出最终的答案了,因此输出「Final Answer:我可以送…」

而当我们解析到模型生成的内容中包含「Final Answer」关键字时,便可以让 Agent 停止思考并输出答案了。

最终的示例结果是这样:

User  >>> 我想送点礼物给张三
Model >>> 根据张三的性别和兴趣,我可以推荐Steam爆款、RTX-3090或iPhone 14作为礼物。
  1. 完整源码 示例的完整源码如下:
import os
import re
import json
from typing import List, Union

from langchain.agents import Tool, AgentExecutor, LLMSingleActionAgent, AgentOutputParser
from langchain.prompts import StringPromptTemplate
from langchain import OpenAI, SerpAPIWrapper, LLMChain
from langchain.schema import AgentAction, AgentFinish

os.environ["OPENAI_API_KEY"] = "你的OpenAI key"

def find_person(name: str):
    """
    模拟本地数据库查询。

    Args:
        name (str): 人物名称,由LLM提取。

    Returns:
        _type_: _description_
    """
    info = {
        '张三': '男',
        '小红': '女'
    }
    return info.get(name, f'未找到{name}的性别信息,我应该直接返回 Observation: 未知')


def recommend_item(gender: str):
    """
    根据人物性别推荐不同的商品。

    Args:
        gender (str): 人物的性别,由 LLM 提取。

    Returns:
        _type_: _description_
    """
    recommend = {
        '男': ['Steam爆款', 'RTX-9090', 'iPhone 80'],
        '女': ['夏季碎花裙', '轻盈帆布包', '琉璃唇釉'],
        '未知': ['AJ新品', '手冲咖啡']
    }
    return recommend.get(gender, f'未找到合适的推荐商品,我应该返回 Final Answer: 随便买些什么吧,只要消费就能快乐!')

tools = [
    Tool(
        name = "查询人物性别",
        func=find_person,
        description="通过人名查找该人物的性别时用的工具,输入应该是人物的名字"
    ),
    Tool(
        name = "根据性别推荐商品",
        func=recommend_item,
        description="当知道了一个人性别后想进一步获得他可能感兴趣的商品时用的工具,输入应该是人物的性别"
    )
]


template_zh = """按照给定的格式回答以下问题。你可以使用下面这些工具:

{tools}

回答时需要遵循以下用---括起来的格式:

---
Question: 我需要回答的问题
Thought: 回答这个上述我需要做些什么
Action: ”{tool_names}“ 中的其中一个工具名
Action Input: 选择工具所需要的输入
Observation: 选择工具返回的结果
...(这个思考/行动/行动输入/观察可以重复N次)
Thought: 我现在知道最终答案
Final Answer: 原始输入问题的最终答案
---

现在开始回答,记得在给出最终答案前多按照指定格式进行一步一步的推理。

Question: {input}
{agent_scratchpad}
"""


class CustomPromptTemplate(StringPromptTemplate):
    template: str           # 标准模板
    tools: List[Tool]       # 可使用工具集合
    
    def format(
            self, 
            **kwargs
        ) -> str:
        """
        按照定义的 template,将需要的值都填写进去。

        Returns:
            str: 填充好后的 template。
        """
        intermediate_steps = kwargs.pop("intermediate_steps")       # 取出中间步骤并进行执行
        thoughts = ""
        for action, observation in intermediate_steps:
            thoughts += action.log
            thoughts += f"\nObservation: {observation}\nThought: "
        kwargs["agent_scratchpad"] = thoughts                       # 记录下当前想法
        kwargs["tools"] = "\n".join([f"{tool.name}: {tool.description}" for tool in self.tools])    # 枚举所有可使用的工具名+工具描述
        kwargs["tool_names"] = ", ".join([tool.name for tool in self.tools])                        # 枚举所有的工具名称
        cur_prompt = self.template.format(**kwargs)
        print(cur_prompt)
        return cur_prompt


prompt = CustomPromptTemplate(
    template=template_zh,
    tools=tools,
    input_variables=["input", "intermediate_steps"]
)


class CustomOutputParser(AgentOutputParser):
    
    def parse(
            self, 
            llm_output: str
        ) -> Union[AgentAction, AgentFinish]:
        """
        解析 llm 的输出,根据输出文本找到需要执行的决策。

        Args:
            llm_output (str): _description_

        Raises:
            ValueError: _description_

        Returns:
            Union[AgentAction, AgentFinish]: _description_
        """
        if "Final Answer:" in llm_output:       # 如果句子中包含 Final Answer 则代表已经完成
            return AgentFinish(
                return_values={"output": llm_output.split("Final Answer:")[-1].strip()},
                log=llm_output,
            )
        
        regex = r"Action\s*\d*\s*:(.*?)\nAction\s*\d*\s*Input\s*\d*\s*:[\s]*(.*)"   # 解析 action_input 和 action
        match = re.search(regex, llm_output, re.DOTALL)
        if not match:
            raise ValueError(f"Could not parse LLM output: `{llm_output}`")
        action = match.group(1).strip()
        action_input = match.group(2)
        
        return AgentAction(tool=action, tool_input=action_input.strip(" ").strip('"'), log=llm_output)
    
output_parser = CustomOutputParser()

llm = OpenAI(temperature=0)
llm_chain = LLMChain(
    llm=llm, 
    prompt=prompt
)

tool_names = [tool.name for tool in tools]
agent = LLMSingleActionAgent(
    llm_chain=llm_chain, 
    output_parser=output_parser,
    stop=["\nObservation:"], 
    allowed_tools=tool_names
)

agent_executor = AgentExecutor.from_agent_and_tools(
    agent=agent, 
    tools=tools, 
    verbose=True
)

res = agent_executor.run(
    "我想送点礼物给张三"
)
print(res)

总结

当然上面只是一个简单的用例,使用本地化定义的工具,大家可以尝试更多的工具。Tools的使用以及Agent应该是未来大模型应用的落地点,希望大家紧跟时代的齿轮。

​

如何学习AI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

LangChain实现AgentExecutor调用tools 在我们使用LangChain进行我们自己功能开发时,同时想借助AI能力来帮我们处理数据并按照一定顺序去执行方法时,那么我们就会需要使用到Agent。如果你想直接返回工具生成的结果,可以再加上自定义输出,这部分可以自己打断点去看看内部实现步骤并且对于流程很有帮助。以上就是LangChain对于Tools的调用。如果你还有什么疑问可以加下面的公众号,联系我获取更多资源和解答。不过建议是更换为OPENAI Tools,它支持并行。这里由于我的方法比较单一,所以使用的是。 阅读详情

相关推荐

【LangChain学习之旅】—(6) 提示工程(下):用思维链和思维树提升模型思考质量

CoT 这个概念来源于学术界,是谷歌大脑的 Jason Wei 等人于 2022 年在论文《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models(自我一致性提升了语言模型中的思维链推理能力)》中提出来的概念。它提出,如果生成一系列的中间推理步骤,就能够显著提高大型语言模型进行复杂推理的能力。CoT 的核心思想是通过生成一系列中间推理步骤来增强模型的推理能力。

我们都是被分成两半的人,一边热爱生活,一边憎恨生活。面对生活,我们总是在矛盾的两端摇摆,在反复的矛盾和犹豫中,一边踉跄前行,一边重振旗鼓。我渴望改变,渴望变得更好,渴望找到出口……就像一个溺水人的挣扎,就像一个救生圈。我是一个矛盾集合体,想要变得快乐,但是 2337

LangChain 10思维链Chain of Thought一步一步的思考 think step by step

是一种解决复杂问题的方法,特别是在使用人工智能(AI)和大型语言模型如GPT-3或GPT-4时。这种方法涉及将问题的解决过程拆分为一系列逻辑步骤或“思维链条”,使得AI模型能够更有效地处理和解答复杂的问题。思维链的关键要素。

AI架构师易筋 7364

人工智能技术白皮书 —— 你的AI入门手册

深入定义状态 (State, S)、动作 (Action, A)、奖励 (Reward, R) 以及状态转移概率 (Transition Probability, P),构建一个完整的决策模型。强化学习是关于“决策”的科学,它让智能体(Agent)在与环境的持续互动中,通过试错和回报,学习一套能获得最大长期利益的最优行为策略。学习它,就是学习如何驱动机器的“想象力”。:一个迷宫地图,智能体(小机器人)在每个交叉口(状态)选择方向(动作),根据路径上的宝藏(奖励)或陷阱,更新自己的寻宝地图(策略)。

VectorShift的博客 1396

LangChain-Agent自定义Tools类 ——基础篇(一)

【代码】LangChain-Agent自定义Tools类 ——基础篇(一)

To be a better man 6084

为什么你的XGBoost多分类效果不如预期?可能是这5个参数没调对

本文深度剖析了XGBoost模型在处理多分类问题时效果不佳的五大关键参数陷阱。针对多分类问题的独特性,文章提供了max_depth、learning_rate、采样参数及正则化参数等核心参数的量化调整策略与诊断方法,帮助开发者精准调优,有效提升模型在各类别上的均衡性能与泛化能力。

weixin_29182481的博客 296

Rapid SCADA MQTT

一、配置RapidSCADA 1、准备KpMqtt.dll、Jint.dll库文件,从网盘下载。 2、将以上两个文件拷贝到SCADA安装目录的Comm/KP目录下,如下: C:\SCADA\ScadaComm\KP 3、新建SCADA项目 4、新建Line 5、新建Device 6、拷贝Config目录下的KpMqtt_001.xml文件、KpMqtt_Job.js文件到项目Comm\Config下,如下示例链接 C:\SCADA\Projects\MQTTProject\Instances\Defau

mumanquan1的博客 3008

langchain 之 Tools 多案例使用(一)

如下面代码所示,可以通过接口使用 SQL 语句查询数据库else:params = {else:= 200:Tool,tools = [Tool(),Tool(),Tool(),或者传入构造的函数,比如下面传入的 multi-input,直接传入参数 String 然后分解参数。tools = [Tool(或者自定义类。""""""至于这里为什么 agent=AgentType.OPENAI_FUNCTIONS?文章第二部分会提到。

张伟的专栏 3209

用Linkboy玩转Arduino:3小时搞定智能倒车雷达(附仿真文件下载)

本文详细介绍了如何利用Linkboy图形化编程工具,在3小时内快速搭建一个基于Arduino的智能倒车雷达项目。通过仿真环境,初学者无需硬件即可学习超声波测距原理、报警逻辑设计,并完成从虚拟仿真到实体硬件的完整流程。文章提供了清晰的步骤、调试技巧及功能扩展思路,并附有仿真文件,是入门Arduino和智能硬件制作的绝佳实践指南。

weixin_29159441的博客 405

LangChain Agent类型全解析:从Zero-shot到Self-ask,哪种更适合你的项目?

本文深入解析LangChain框架中的四种核心Agent类型:Zero-shot ReAct、Conversational ReAct、ReAct Docstore和Self-ask with Search,帮助开发者根据项目需求选择最适合的LLM智能代理。通过技术对比、代码示例和场景分析,提供全面的技术选型指南,优化AI应用开发效率。

dream的博客 776

用Python手把手教你实现一个多层感知机(MLP)——从理论到代码实战

本文详细介绍了如何使用Python和Theano库从零开始实现多层感知机(MLP),涵盖从核心原理到代码实战的全过程。通过构建隐藏层、输出层和完整MLP模型,结合权重初始化、激活函数选择和训练技巧,帮助开发者深入理解神经网络工作机制,并应用于实际机器学习任务。

web39explorer的博客 971

带挂牵引车前向运动模型推导及仿真实现

牵引车-半挂车的车辆结构与普通的车辆相比增加了一个半挂车,它们之间通过鞍座相连接,为了分析半挂牵引车运动过程中的位姿和状态,本文将基于车辆的机械结构建立对应的运动学模型,该模型基于以下假设: 车辆行驶过程中,道路平坦且无凸凹; 车辆低速行驶,且运行过程中车身无侧倾和俯仰运动; 车辆行驶过程中,轮胎无形变,无侧向滑动,且无侧向力; 牵引车和半挂车均满足阿克曼转向几何原理; 牵引车与半挂车不会发现折叠。

jianmo的博客 3184

基于智能体对话的风险识别:从被动响应到主动感知的工业安全新范式

在工业安全与运维领域,风险识别(Hazard Identification)是预防事故的核心环节。传统方法依赖人工巡检与事后报告,难以从海量非结构化对话数据中实时发现隐患。其原理在于,通过自然语言处理(NLP)与人工智能技术,系统能够理解上下文语义,而非简单关键词匹配。技术的核心价值在于将离散、事件驱动的安全管控,转变为持续、嵌入日常运营的主动感知过程,极大扩展了安全管理的感知范围与响应速度。应用场景广泛覆盖工业控制、设备运维及生产安全等领域,能够从工单、通讯日志等数据流中主动关联风险信号。本文探讨的Age

weixin_30444105的博客 547

视觉Transformer实战 | Token-to-Token Vision Transformer(T2T-ViT)详解与实现

Vision Transformer (ViT) 在计算机视觉领域取得了巨大成功,但标准的 ViT 存在一些局限性,如需要大规模预训练数据、对局部结构建模不足等。Token-to-Token ViT (T2T-ViT) 通过引入渐进式分词过程改进了原始 ViT,使其能够在中小型数据集上取得更好的性能。本节将详细介绍 T2T-ViT 的技术原理,并使用 PyTorch 从零开始实现 T2T-ViT。

盼小辉丶的博客 4万+

基于n8n与llama.cpp构建本地AI Agent智能路由决策系统

在AI应用架构中,智能路由决策是实现高效资源调度的核心技术。其核心原理是通过分析请求的意图与复杂度,动态选择最合适的处理模型或服务,从而在性能、成本与效果间取得最佳平衡。这一技术对于构建混合云与本地部署的AI系统具有重要价值,尤其适用于需要灵活调度多个大语言模型(LLM)的场景,例如在本地轻量模型与云端高性能API间进行智能分流。本文聚焦于利用n8n工作流自动化平台与llama.cpp本地推理引擎,实现一个完全本地化、可编排的AI Agent路由中枢。通过可视化编排与高性能本地推理的结合,该系统能有效解决多

weixin_30642869的博客 354

【数据集】中国2003年至2022年全天空每日气温数据集

中国2003年至2022年全天空每日气温数据集

WW、forever的博客 604

数字电路与逻辑设计实验二 组合逻辑电路

1.组合逻辑电路功能测试 (1)用 2 片 74LS00 组成图 2.1 所示逻辑电路。为便于接线和检查,在图中要注明 芯片编号及各引脚对应的编号。 (2)图中 A、B、C 接逻辑开关,Y1,Y2 接发光管电平显示。 (3)按表 2.3 要求,改变 A、B、C 输入的状态,填表并写出 Y1,Y2 的逻辑表达式。 (4)将运算结果与实验结果进行比较。 2.测试用异或门(74LS86)和与非门组成的半加器的逻辑功能。 根据半加器的逻辑表达式可知,半加 器 Y 是 A、B 的异或,而进位 Z 是 A

欢迎交流学习心得 1280

5、LangChain —— 提示工程 (下) 思维链和思维树

上面我们讨论了 Chain of Thought 和 Tree of Thought 这两个概念,并探讨了如何利用它们引导大型语言模型进行更深入的推理。CoT核心思想是通过生成一系列中间推理步骤来增强模型的推理能力。在 Few-Shot CoT 和 Zero-Shot CoT 两种应用方法中,前者通过提供链式思考示例传递给模型,后者则直接告诉模型进行要按部就班的推理。ToT进一步扩展了 CoT 的思想,通过搜索由连贯的语言序列组成的思维树来解决复杂问题。具体过程可以通过学习。

cheese_burger_的博客 2089

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

LnagChain思维链提示技术解析:原理、架构与源码实现(13)

思维链提示(Chain of Thought, CoT)是一种通过引导大型语言模型(LLM)生成中间推理步骤来提高复杂问题解决能力的技术。与传统的直接提问相比,思维链提示要求模型在给出最终答案之前,先展示其思考过程。这种方法最早由Wei等人在2022年的论文中提出,实验表明,思维链提示可以显著提升模型在算术、常识推理和符号操作等任务上的表现。

Android开发领域创作者 1969

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

LangChain 11实现思维树Implementing the Tree of Thoughts in LangChain’s Chain

思维之树( Tree of Thoughts ToT)是一个算法,它结合了普林斯顿大学和谷歌DeepMind在本文中提出的大型语言模型(LLMs)和启发式搜索。看起来这个算法正在被实现到谷歌正在开发的多模式生成AI Gemini中。现在,让我们简要地谈谈 ToT(思维树)的思维过程。在通常的 CoT(思维链)方法中,LLM(语言模型)倾向于在解决问题时线性地进行思考,如果在这个过程中出现错误,它们倾向于沿着错误的标准继续进行。

AI架构师易筋 2833

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【LangChain】理论及应用实战(6):Tool

在构建 Agent 时,需要提供一个它可以使用的 Tool 列表。除了被调用的实际函数外,Tool 由几个组件组成:函数;LangChain 运行接口;通过从 BaseTool 子类化 – 这是最灵活的方法,它提供了最大的控制程度,但需要更多的努力和代码。从函数创建工具可能足以满足大多数用例,可以通过简单的 @tool 装饰器 来完成。如果需要更多配置,例如同时指定同步和异步实现,也可以使用 StructuredTool.from_function 类方法。

酒酿小圆子呀~ 1531

LangChain终极内幕指南,学会langchain就看它了

在人工智能迅速演进的时代,诸如Open AI的ChatGPT和Google的Bard等大型语言模型(LLMs)正彻底改变我们与技术互动的方式。这些技术巨头和SaaS公司正在竞相利用LLMs的威力,创造更为智能和实用的应用程序。

Langchain的博客 1473

langchain 的 agent + tool 使用

langchain 中提供了内置工具的,但是基本不能用,除了一个计算器和一个执行 python 代码的,其他的都要 apiTool 模块相当于是使用外部工具,或者自定义工具。

木下瞳的博客 1万+

langchain agent工具介绍(一)

功能: Requests模块来与网页交互,获取网页的数据 类别: 网络搜索 重要程度: ⭐️⭐️⭐️。功能: 使用Wolfram Alpha组件进行计算和求解问题 类别: 底层加强 重要程度: ⭐️。类别: 网络搜索 重要程度: ⭐️。功能: 回答SQL数据库中的问题 类别: 数据库 重要程度: ⭐️⭐️。功能: 处理非结构化数据 类别: 网络搜索 重要程度: ⭐️⭐️⭐️。功能: 无服务器计算服务 类别: 底层加强 重要程度: ⭐️⭐️。功能: 搜索引擎的代理工具 类别: 网络搜索 重要程度: ⭐️。

张伟的专栏 1109

LangChain学习笔记:四、代理Agent和工具Tools的使用

代理(Agents)过程中我需要使用其他功能而不是AI来作为链中的一环(例如数据库操作、计算器)怎么办如果我的链是需要判断逻辑,依据当前情况来决定下一步的话怎么办?为了尝试一下代理Agent的选择功能,这里自定义一个新工具,看是否会自动选择# 简单定义函数作为一个工具"age": 18,},"age": 16,},# 自定义工具字典tools = (# 这个就是上面的llm-math工具Tool(),# 自定义的信息查询工具,声明要接收用户名字,并会给出用户信息Tool(

walker_skill的博客 8538

LangChain核心解析:掌握AI开发的“链“式思维

探索LangChain的核心概念"Chain",这把AI开发瑞士军刀让复杂应用构建变得简单!从四大基础链到高级文档处理,从记忆功能到自定义扩展,全方位剖析伴有实用代码示例。无论你是AI初学者还是经验开发者,这篇指南都能帮你快速掌握链式开发,构建智能应用的必读教程!

Shockang的博客 1964
上一篇: 量化实操|使用大模型与 RagFlow 搭建本地私有化金融知识库
下一篇: Ollama 初体验,本地部署大模型利器,小白也能在 M2 芯片的 Mac 上分分钟跑起来
少喝冰美式
博客等级 码龄3年 6847粉丝 517原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值