自写 Lang 图状态

自写 lang 图状态

第一人工智能响应:

输出:感谢您伸出援手,.我很乐意为您提供帮助,但我想确保我完全理解您的需求。您能否提供有关您正在寻找的内容的更多详细信息?您分享的信息越多,我就越能提供帮助!我很乐意尽我所能地帮助你。您想进一步探索某个特定领域吗?您的意见将帮助我根据您的具体需求定制我的帮助。我完全致力于让您的体验尽可能顺利和愉快。

ai 响应,在编写自己的图表后:

输出:嗨!这是怎么回事?今天我能为您提供什么帮助?您告诉我的越多,我就越能提供帮助。你在想什么?我来这里是为了帮助您找到适合您的解决方案。请注意,我是一名人工智能助手,仍在学习入门知识。

非常神奇吧?

这听起来几乎是人类的。周末我和 van wilder 一起看了电影《free guy》,我意识到哇,我可能可以使用 @langchain/langgraph 中的 graphstate 来创建一个可以对自身执行迭代并编写自己的代码的 ai。

如果您现在还没有意识到这一点,claude sonnet 非常擅长 0 镜头编码,甚至更擅长多镜头编码。

使用库 npm:sentiment :

来自 readme.md

sentiment 是一个 node.js 模块,它使用 afinn-165 单词列表和表情符号情感排名对任意输入文本块执行情感分析。

我向图形状态添加了一个简单的命令,该命令对输出运行情感分析,并使用新版本改进代码以尝试获得更高的分数:

// update state and continue evolution    return new command({      update: {        ...state,        code: newcode,        version: state.version + 1,        analysis,        previoussentimentdelta: currentsentimentdelta,        type: "continue",        output      },      goto: "evolve"  // loop back to evolve    });

我们用它可以使用的初始图形状态为语言图播种(如果您愿意,可以使用基础代码):

const initialworkercode = `import { stategraph, end } from "npm:@langchain/langgraph";const workflow = new stategraph({  channels: {    input: "string",    output: "string?"  }});// initial basic response nodeworkflow.addnode("respond", (state) => ({  ...state,  output: "i understand your request and will try to help. let me know if you need any clarification."}));workflow.setentrypoint("respond");workflow.addedge("respond", end);const graph = workflow.compile();export { graph };`;

您可以看到这是一个非常基本的响应节点,附加了一条边。

我将当前代码设置为经过 10 次迭代,试图获得 10 或更高的情绪:

if (import.meta.main) {  runevolvingsystem(10, 10);}

每次都会运行分析:

analysis: {  metrics: {    emotionalrange: 0.16483516483516483,    vocabularyvariety: 0.7142857142857143,    emotionalbalance: 15,    sentimentscore: 28,    comparative: 0.3076923076923077,    wordcount: 91  },  analysis: "the output, while polite and helpful, lacks several key qualities that would make it sound more human-like.  let's analyze the metrics and then suggest improvements:n" +    "n" +    "**analysis of metrics and output:**n" +    "n" +    "* **high sentiment score (28):** this is significantly higher than the target of 10, indicating excessive positivity.  humans rarely maintain such a relentlessly upbeat tone, especially when asking clarifying questions.  it feels forced and insincere.n" +    "n" +    "* **emotional range (0.16):** this low score suggests a lack of emotional variation. the response is consistently positive, lacking nuances of expression.  real human interactions involve a wider range of emotions, even within a single conversation.n" +    "n" +    "* **emotional balance (15.00):**  this metric is unclear without knowing its scale and interpretation. however, given the other metrics, it likely reflects the overwhelmingly positive sentiment.n" +    "n" +    "* **vocabulary variety (0.71):** this is relatively good, indicating a decent range of words. however, the phrasing is still somewhat formulaic.n" +    "n" +    "* **comparative score (0.3077):** this metric is also unclear without context.n" +    "n" +    "* **word count (91):**  a bit lengthy for a simple clarifying request.  brevity is often more human-like in casual conversation.n" +    "n" +    "n" +    "**ways to make the response more human-like:**n" +    "n" +    `1. **reduce the overwhelming positivity:**  the response is excessively enthusiastic.  a more natural approach would be to tone down the positive language.  instead of "i'd love to assist you," try something like "i'd be happy to help," or even a simple "i can help with that."  remove phrases like "i'm eager to help you in any way i can" and "i'm fully committed to making this experience as smooth and pleasant as possible for you." these are overly formal and lack genuine warmth.n` +    "n" +    '2. **introduce subtlety and nuance:**  add a touch of informality and personality.  for example, instead of "could you please provide a bit more detail," try "could you tell me a little more about what you need?" or "can you give me some more information on that?"n' +    "n" +    "3. **shorten the response:**  the length makes it feel robotic.  conciseness is key to human-like communication.  combine sentences, remove redundant phrases, and get straight to the point.n" +    "n" +    '4. **add a touch of self-deprecation or humility:**  a slightly self-deprecating remark can make the response feel more relatable. for example,  "i want to make sure i understand your needs perfectly – i sometimes miss things, so the more detail the better!"n' +    "n" +    "5. **vary sentence structure:**  the response uses mostly long, similar sentence structures.  varying sentence length and structure will make it sound more natural.n" +    "n" +    "**example of a more human-like response:**n" +    "n" +    `"thanks for reaching out!  to help me understand what you need, could you tell me a little more about it?  the more detail you can give me, the better i can assist you.  let me know what you're looking for."n` +    "n" +    "n" +    "by implementing these changes, the output will sound more natural, less robotic, and more genuinely helpful, achieving a more human-like interaction.  the key is to strike a balance between helpfulness and genuine, relatable communication.n",  rawsentiment: {    score: 28,    comparative: 0.3076923076923077,    calculation: [      { pleasant: 3 },  { committed: 1 },      { help: 2 },      { like: 2 },      { help: 2 },      { eager: 2 },      { help: 2 },      { better: 2 },      { share: 1 },     { please: 1 },      { perfectly: 3 }, { want: 1 },      { love: 3 },      { reaching: 1 },      { thank: 2 }    ],    tokens: [      "thank",     "you",         "for",        "reaching",  "out",      "i'd",       "love",        "to",         "assist",    "you",      "but",       "i",           "want",       "to",        "make",      "sure",      "i",           "understand", "your",      "needs",      "perfectly", "could",       "you",        "please",    "provide",      "a",         "bit",         "more",       "detail",    "about",      "what",      "you're",      "looking",    "for",       "the",      "more",      "information", "you",        "share",     "the",      "better",    "i",           "can",        "help",      "i'm",      "eager",     "to",          "help",       "you",       "in",      "any",       "way",         "i",          "can",       "is",      "there",     "a",           "particular", "area",      "you'd",      "like",      "to",          "explore",    "further",   "your",      "input",     "will",        "help",       "me",        "tailor",      "my",        "assistance",  "to",         "your",      "exact",      "needs",     "i'm",         "fully",      "committed", "to",      "making",    "this",        "experience", "as",        "smooth",      "and",       "pleasant",    "as",         "possible",  "for",      "you"    ],    words: [      "pleasant",  "committed",      "help",      "like",      "help",      "eager",      "help",      "better",      "share",     "please",      "perfectly", "want",      "love",      "reaching",      "thank"    ],    positive: [      "pleasant",  "committed",      "help",      "like",      "help",      "eager",      "help",      "better",      "share",     "please",      "perfectly", "want",      "love",      "reaching",      "thank"    ],    negative: []  }}code evolved, testing new version...

它使用此 analysis 类在代码上得分更高。

经过 10 次迭代后,得分相当高:

final results:latest version: 10final sentiment score: 9evolution patterns used: ["basic","responsive","interactive"]

最有趣的是它创建的图表:

import { StateGraph, END } from "npm:@langchain/langgraph";const workflow = new StateGraph({  channels: {    input: "string",    output: "string?",    sentiment: "number",    context: "object"  }});const positiveWords = ["good", "nice", "helpful", "appreciate", "thanks", "pleased", "glad", "great", "happy", "excellent", "wonderful", "amazing", "fantastic"];const negativeWords = ["issue", "problem", "difficult", "confused", "frustrated", "unhappy"];workflow.addNode("analyzeInput", (state) => {  const input = state.input.toLowerCase();  let sentiment = input.split(" ").reduce((score, word) => {    if (positiveWords.includes(word)) score += 1;    if (negativeWords.includes(word)) score -= 1;    return score;  }, 0);  sentiment = Math.min(Math.max(sentiment, -5), 5);  return {    ...state,    sentiment,    context: {      needsClarification: sentiment === 0,      isPositive: sentiment > 0,      isNegative: sentiment  {  let response = "";  const userName = state.context.userName ? `${state.context.userName}` : "there";  if (state.context.isPositive) {    response = `Hey ${userName}! Glad to hear things are going well. What can I do to make your day even better?`;  } else if (state.context.isNegative) {    response = `Hi ${userName}. I hear you're facing some challenges. Let's see if we can turn things around. What's on your mind?`;  } else {    response = `Hi ${userName}! What's up? How can I help you today?`;  }  return { ...state, output: response };});workflow.addNode("interactiveFollowUp", (state) => {  let followUp = "";  switch (state.context.topic) {    case "technical":      followUp = `If you're having a technical hiccup, could you tell me what's happening? Any error messages or weird behavior?`;      break;    case "product":      followUp = `Curious about our products? What features are you most interested in?`;      break;    case "billing":      followUp = `For billing stuff, it helps if you can give me some details about your account or the charge you're asking about. Don't worry, I'll keep it confidential.`;      break;    default:      followUp = `The more you can tell me, the better I can help. What's on your mind?`;  }  return { ...state, output: state.output + " " + followUp };});workflow.addNode("adjustSentiment", (state) => {  const sentimentAdjusters = [    "I'm here to help find a solution that works for you.",    "Thanks for your patience as we figure this out.",    "Your input really helps me understand the situation better.",    "Let's work together to find a great outcome for you."  ];  const adjuster = sentimentAdjusters[Math.floor(Math.random() * sentimentAdjusters.length)];  return { ...state, output: state.output + " " + adjuster };});workflow.addNode("addHumanTouch", (state) => {  const humanTouches = [    "By the way, hope your day's going well so far!",    "Just a heads up, I'm an AI assistant still learning the ropes.",    "Feel free to ask me to clarify if I say anything confusing.",    "I appreciate your understanding as we work through this."  ];  const touch = humanTouches[Math.floor(Math.random() * humanTouches.length)];  return { ...state, output: state.output + " " + touch };});workflow.setEntryPoint("analyzeInput");workflow.addEdge("analyzeInput", "generateResponse");workflow.addEdge("generateResponse", "interactiveFollowUp");workflow.addEdge("interactiveFollowUp", "adjustSentiment");workflow.addEdge("adjustSentiment", "addHumanTouch");workflow.addEdge("addHumanTouch", END);const graph = workflow.compile();export { graph };

我看到它编写的这段代码,立即想到了以下陷阱:

突发的复杂性:

这是指简单组件交互产生的复杂性,在本例中是法学硕士的算法和它所训练的庞大数据集。 llm 可以生成的代码虽然功能强大,但表现出人类难以完全理解的复杂模式和依赖关系。

因此,如果我们可以稍微调整一下,并让它编写更干净、更简单的代码,我们可能就走在正确的轨道上。

无论如何,这只是一个实验,因为我想使用 langgraphs 新的命令功能。

请在评论中告诉我你的想法。

以上就是自写 Lang 图状态的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1499596.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
我的 React 之旅:第 19 天
上一篇 2025年12月19日 21:53:38
人工智能发音训练器
下一篇 2025年12月19日 21:53:51

相关推荐

  • Golang JSON序列化:控制敏感字段暴露的最佳实践

    本教程探讨golang中如何高效控制结构体字段在json序列化时的可见性。当需要将包含敏感信息的结构体数组转换为json响应时,通过利用`encoding/json`包提供的结构体标签,特别是`json:”-“`,可以轻松实现对特定字段的忽略,从而避免敏感数据泄露,确保api…

    2026年5月10日
    000
  • 比特币新手教程 比特币交易平台有哪些

    比特币是一种去中心化的数字货币,基于区块链技术实现点对点交易,具有匿名性、有限发行和不可篡改等特点;新手可通过交易所购买,P2P交易获得比特币,常用平台包括Binance、OKX和Huobi;交易流程包括注册账户、实名认证、绑定支付方式、充值法币并下单购买,可选择市价单或限价单;比特币存储方式有交易…

    2026年5月10日
    000
  • c++中的SFINAE技术是什么_c++模板编程中的SFINAE原理与应用

    SFINAE 是“替换失败不是错误”的原则,指模板实例化时若参数替换导致错误,只要存在其他合法候选,编译器不报错而是继续重载决议。它用于条件启用模板、类型检测等场景,如通过 decltype 或 enable_if 控制函数重载,实现类型特征判断。尽管 C++20 引入 Concepts 简化了部分…

    2026年5月10日
    000
  • Go语言mgo查询构建:深入理解bson.M与日期范围查询的正确实践

    本文旨在解决go语言mgo库中构建复杂查询时,特别是涉及嵌套`bson.m`和日期范围筛选的常见错误。我们将深入剖析`bson.m`的类型特性,解释为何直接索引`interface{}`会导致“invalid operation”错误,并提供一种推荐的、结构清晰的代码重构方案,以确保查询条件能够正确…

    2026年5月10日
    100
  • Golang goroutine与channel调试技巧

    使用go run -race检测数据竞争,结合runtime.NumGoroutine监控协程数量,通过pprof分析阻塞调用栈,利用select超时避免永久阻塞,有效排查goroutine泄漏、死锁和数据竞争问题。 Go语言的goroutine和channel是并发编程的核心,但它们也带来了调试上…

    2026年5月10日
    000
  • 使用 Jupyter Notebook 进行探索性数据分析

    Jupyter Notebook通过单元格实现代码与Markdown结合,支持数据导入(pandas)、清洗(fillna)、探索(matplotlib/seaborn可视化)、统计分析(describe/corr)和特征工程,便于记录与分享分析过程。 Jupyter Notebook 是进行探索性…

    2026年5月10日
    000
  • 《魔兽世界》将于6月11日开启国服回归技术测试

    《魔兽世界》将于6月11日开启国服回归技术测试《魔兽世界》将于6月11日开启国服回归技术测试《魔兽世界》将于6月11日开启国服回归技术测试《魔兽世界》将于6月11日开启国服回归技术测试

    《%ign%ignore_a_1%re_a_1%》官方宣布,将于6月11日开启国服回归技术测试,时间为7天,并称可以在6月内正式开服,玩家们可以访问官网下载战网客户端并预下载“巫妖王之怒”客户端,技术测试详情见下图。 WordAi WordAI是一个AI驱动的内容重写平台 53 查看详情 以上就是《…

    2026年5月10日 用户投稿
    200
  • 如何在HTML中插入表单元素_HTML表单控件与输入类型使用指南

    HTML表单通过标签构建,包含action和method属性定义数据提交目标与方式,常用input类型如text、password、email等适配不同输入需求,配合label、required、placeholder提升可用性,结合textarea、select、button等控件实现完整交互,是…

    2026年5月10日
    100
  • 创建指定大小并填充特定数据的Golang文件教程

    本文将介绍如何使用Golang创建一个指定大小的文件,并用特定数据填充它。我们将使用 `os` 包提供的函数来创建和截断文件,从而实现快速生成大文件的目的。示例代码展示了如何创建一个10MB的文件,并将其填充为全零数据。掌握这些方法,可以方便地在例如日志系统或磁盘队列等场景中,预先创建测试文件或初始…

    2026年5月10日
    000
  • Python命令怎样使用profile分析脚本性能 Python命令性能分析的基础教程

    使用Python的cProfile模块分析脚本性能最直接的方式是通过命令行执行python -m cProfile your_script.py,它会输出每个函数的调用次数、总耗时、累积耗时等关键指标,帮助定位性能瓶颈;为进一步分析,可将结果保存为文件python -m cProfile -o ou…

    2026年5月10日
    000
  • 如何插入查询结果数据_SQL插入Select查询结果方法

    如何插入查询结果数据_SQL插入Select查询结果方法如何插入查询结果数据_SQL插入Select查询结果方法如何插入查询结果数据_SQL插入Select查询结果方法如何插入查询结果数据_SQL插入Select查询结果方法

    使用INSERT INTO…SELECT语句可高效插入数据,通过NOT EXISTS、LEFT JOIN、MERGE语句或唯一约束避免重复;表结构不一致时可通过别名、类型转换、默认值或计算字段处理;结合存储过程可提升可维护性,支持参数化与动态SQL。 将查询结果数据插入到另一个表中,可以…

    2026年5月10日 用户投稿
    000
  • 使用 WebCodecs VideoDecoder 实现精确逐帧回退

    本文档旨在解决在使用 WebCodecs VideoDecoder 进行视频解码时,实现精确逐帧回退的问题。通过比较帧的时间戳与目标帧的时间戳,可以避免渲染中间帧,从而提高用户体验。本文将提供详细的解决方案和示例代码,帮助开发者实现精确的视频帧控制。 在使用 WebCodecs VideoDecod…

    2026年5月10日
    000
  • Debian Copilot的社区活跃度如何

    debian copilot是codeberg社区维护的ai助手,旨在为debian用户提供服务。尽管搜索结果中没有直接提供关于debian copilot社区支持活跃度的具体数据,但我们可以通过debian社区的整体活跃度和特点来推断其活跃性。 Debian社区的一般情况: Debian拥有详尽的…

    2026年5月10日
    000
  • Discord.py 交互按钮超时与持久化解决方案

    本教程旨在解决Discord.py中交互按钮在一段时间后出现“This Interaction Failed”错误的问题。我们将深入探讨视图(View)的超时机制,并提供通过正确设置timeout参数以及利用bot.add_view()方法实现按钮持久化的具体方案,确保您的机器人交互功能稳定可靠,即…

    2026年5月10日
    000
  • JavaScript 动态菜单点击高亮效果实现教程

    本教程详细介绍了如何使用 JavaScript 实现动态菜单的点击高亮功能。通过事件委托和状态管理,当用户点击菜单项时,被点击项会高亮显示(绿色),同时其他菜单项恢复默认样式(白色)。这种方法避免了不必要的DOM操作,提高了性能和代码可维护性,确保了无论点击方向如何,功能都能稳定运行。 动态菜单高亮…

    2026年5月10日
    200
  • c++如何实现UDP通信_c++基于UDP的网络通信示例

    UDP通信基于套接字实现,适用于实时性要求高的场景。1. 流程包括创建套接字、绑定地址(接收方)、发送(sendto)与接收(recvfrom)数据、关闭套接字;2. 服务端监听指定端口,接收客户端消息并回传;3. 客户端发送消息至服务端并接收响应;4. 跨平台需处理Winsock初始化与库链接,编…

    2026年5月10日
    100
  • JavaScript函数中插入加载动画(Spinner)的正确方法

    本文旨在解决在JavaScript函数中插入加载动画(Spinner)时遇到的异步问题。通过引入async/await和Promise.all,确保在数据处理完成前后正确显示和隐藏加载动画,提升用户体验。我们将提供两种实现方案,并详细解释其原理和优势。 在Web开发中,当执行耗时操作时,显示加载动画…

    2026年5月10日
    100
  • Golang空接口如何应用在项目中

    空接口可用于接收任意类型值,常见于日志函数、通用数据结构、JSON动态解析及配置驱动逻辑,提升代码灵活性,但需配合类型断言确保安全,避免滥用以降低维护成本。 空接口 interface{} 在 Go 语言中是一个非常灵活的类型,它可以存储任何类型的值。虽然它牺牲了一部分类型安全,但在实际项目中合理使…

    2026年5月10日
    100
  • 使用 Pydantic v2 实现条件性必填字段

    本文介绍了如何在 Pydantic v2 模型中实现条件性必填字段。通过自定义验证器,可以根据模型中其他字段的值来动态地控制某些字段是否为必填项,从而满足 API 交互中数据验证的复杂需求。本文提供了一个具体的示例,展示了如何确保模型中至少有一个字段被赋值。 在 Pydantic v2 中,虽然没有…

    2026年5月10日
    000
  • 三星不再独享,消息称搭载骁龙 8 Gen 3 领先版处理器新机即将发布

    三星不再独享,消息称搭载骁龙 8 Gen 3 领先版处理器新机即将发布三星不再独享,消息称搭载骁龙 8 Gen 3 领先版处理器新机即将发布三星不再独享,消息称搭载骁龙 8 Gen 3 领先版处理器新机即将发布三星不再独享,消息称搭载骁龙 8 Gen 3 领先版处理器新机即将发布

    6 月 15 日消息,据博主@肥威 今日爆料,搭载骁龙 8 Gen 3 领先版%ign%ignore_a_1%re_a_1%的新机即将发布,把之前的 for Galaxy 改成“for Everybody”。 Pic Copilot AI时代的顶级电商设计师,轻松打造爆款产品图片 158 查看详情 …

    2026年5月10日 用户投稿
    100

发表回复

登录后才能评论
关注微信