暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

golang实现langchain graph

        多智能体也可以看作是一个智能体,因为本质上它是一个系统,只是功能多而已。在LangGraph的文档中,使用Multi-agent表示。LangChain的核心优势在于其能够轻松构建自定义链,这些链通常是线性的,类似于有向无环图(DAG),每个步骤都严格按顺序执行,每个任务只有一个输出和一个后续任务,形成一个没有循环的线性流程。
        在遇到复杂任务时,比如第一次搜索没有找到想要的内容,我们可能需要进行第二次、第三次搜索,甚至可能需要调用网络搜索来完成。在这种情况下,顺序执行的任务(DAG)显然无法满足需求。请求方和搜索方之间需要经历多次来回沟通,请求方可能会要求搜索方根据反馈调整搜索策略,这种多次的循环沟通才能逐步逼近最终答案。LangGraph概念:
1.StateGraph(状态图):包含了状态表示的一个图结构。这个图状态代表了一个中心状态对象,它会在执行过程中不断更新。这个图状态对象由图中的节点更新,节点会以键值对的形式,返回对状态属性的操作。2.Nodes(节点):创建了StateGraph之后,需要向其中添加节点;每个节点都代表一个任务,它们执行的结果会影响StateGraph的状态。这些节点通过边相互连接,形成了一个有向无环图(DAG),确保了任务的正确执行顺序。
3.Edges(边)是连接Nodes(节点)并定义StateGraph(状态图)中节点执行顺序的关键部分。边主要分为以下几种:
起始边(Starting Edge):作为图的开始,比如在旅行计划中,起始边就是确定你的目的地。一旦目的地被确定,你的旅行计划就可以开始执行了。
普通边(Normal Edges):这些边表示一个节点总是要在另一个节点之后被调用。在旅行计划中,普通边就像是确定了任务执行的顺序。
条件边(Conditional Edges):使用函数(通常由LLM提供)来确定首先调用哪个节点。条件边提供了灵活性,使得系统可以根据不同的情况来调整执行的顺序。
        由于github.com/tmc/langgraphgo/graph还在不断完善中,这里还未实现条件边。 下面看一个简单例子:
    package main
    import (
        "context"
        "fmt"
        "github.com/tmc/langchaingo/llms"
        "github.com/tmc/langchaingo/llms/openai"
        "github.com/tmc/langgraphgo/graph"
    )
    func main() {
        model, err := openai.New(
            openai.WithBaseURL("http://127.0.0.1:11434/v1/"),
            openai.WithToken("ollama"),
            openai.WithModel("deepseek-r1:1.5b"),
        )
        if err != nil {
            panic(err)
        }
        g := graph.NewMessageGraph()
        g.AddNode("oracle"func(ctx context.Context, state []llms.MessageContent) ([]llms.MessageContent, error) {
            r, err := model.GenerateContent(ctx, state, llms.WithTemperature(0.0))
            if err != nil {
                return nil, err
            }
            return append(state,
                llms.TextParts(llms.ChatMessageTypeAI, r.Choices[0].Content),
            ), nil
        })
        g.AddNode(graph.END, func(ctx context.Context, state []llms.MessageContent) ([]llms.MessageContent, error) {
            return state, nil
        })
        g.AddEdge("oracle", graph.END)
        g.SetEntryPoint("oracle")
        runnable, err := g.Compile()
        if err != nil {
            panic(err)
        }
        ctx := context.Background()
        // Let's run it!
        res, err := runnable.Invoke(ctx, []llms.MessageContent{
            llms.TextParts(llms.ChatMessageTypeHuman, "What is 1 + 1?"),
        })
        if err != nil {
            panic(err)
        }
        fmt.Println(res)
    }
    执行结果如下:
      [{human [{What is 1 + 1?}]} {ai [{1 + 1 equals 2.}]}]

      文章转载自golang算法架构leetcode技术php,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论