第一人工智能响应:
输出:感谢您伸出援手,.我很乐意为您提供帮助,但我想确保我完全理解您的需求。您能否提供有关您正在寻找的内容的更多详细信息?您分享的信息越多,我就越能提供帮助!我很乐意尽我所能地帮助你。您想进一步探索某个特定领域吗?您的意见将帮助我根据您的具体需求定制我的帮助。我完全致力于让您的体验尽可能顺利和愉快。ai 响应,在编写自己的图表后:
输出:嗨!这是怎么回事?今天我能为您提供什么帮助?您告诉我的越多,我就越能提供帮助。你在想什么?我来这里是为了帮助您找到适合您的解决方案。请注意,我是一名人工智能助手,仍在学习入门知识。
非常神奇吧?
这听起来几乎是人类的。周末我和 van wilder 一起看了电影《free guy》,我意识到哇,我可能可以使用 @langchain/langgraph 中的 graphstate 来创建一个可以对自身执行迭代并编写自己的代码的 ai。
如果您现在还没有意识到这一点,claude sonnet 非常擅长 0 镜头编码,甚至更擅长多镜头编码。
使用库 npm:sentiment :
来自 readme.md
sentiment 是一个 node.js 模块,它使用 afinn-165 单词列表和表情符号情感排名对任意输入文本块执行情感分析。
我向图形状态添加了一个简单的命令,该命令对输出运行情感分析,并使用新版本改进代码以尝试获得更高的分数:
1
2
3
4
5
6
7
8
9
10
11
12
13
// 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
});
我们用它可以使用的初始图形状态为语言图播种(如果您愿意,可以使用基础代码):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const initialworkercode = `
import { stategraph, end } from "npm:@langchain/langgraph";
const workflow = new stategraph({
channels: {
input: "string",
output: "string?"
}
});
// initial basic response node
workflow.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 或更高的情绪:
1
2
3
if (import.meta.main) {
runevolvingsystem(10, 10);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
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. lets analyze the metrics and then suggest improvements:
" +
"
" +
"**analysis of metrics and output:**
" +
"
" +
"* **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.
" +
"
" +
"* **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.
" +
"
" +
"* **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.
" +
"
" +
"* **vocabulary variety (0.71):** this is relatively good, indicating a decent range of words. however, the phrasing is still somewhat formulaic.
" +
"
" +
"* **comparative score (0.3077):** this metric is also unclear without context.
" +
"
" +
"* **word count (91):** a bit lengthy for a simple clarifying request. brevity is often more human-like in casual conversation.
" +
"
" +
"
" +
"**ways to make the response more human-like:**
" +
"
" +
`1. **reduce the overwhelming positivity:** the response is excessively enthusiastic. a more natural approach would be to tone down the positive language. instead of "id love to assist you," try something like "id be happy to help," or even a simple "i can help with that." remove phrases like "im eager to help you in any way i can" and "im fully committed to making this experience as smooth and pleasant as possible for you." these are overly formal and lack genuine warmth.
` +
"
" +
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?"
+
"
" +
"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.
" +
"
" +
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!"
+
"
" +
"5. **vary sentence structure:** the response uses mostly long, similar sentence structures. varying sentence length and structure will make it sound more natural.
" +
"
" +
"**example of a more human-like response:**
" +
"
" +
`"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 youre looking for."
` +
"
" +
"
" +
"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.
",
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",
"id", "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", "youre", "looking", "for", "the",
"more", "information", "you", "share", "the",
"better", "i", "can", "help", "im",
"eager", "to", "help", "you", "in",
"any", "way", "i", "can", "is",
"there", "a", "particular", "area", "youd",
"like", "to", "explore", "further", "your",
"input", "will", "help", "me", "tailor",
"my", "assistance", "to", "your", "exact",
"needs", "im", "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 次迭代后,得分相当高:
1
2
3
4
final results:
latest version: 10
final sentiment score: 9
evolution patterns used: ["basic","responsive","interactive"]
最有趣的是它创建的图表:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
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 < 0,
topic: detectTopic(input),
userName: extractUserName(input)
}
};
});
function detectTopic(input) {
if (input.includes("technical") || input.includes("error")) return "technical";
if (input.includes("product") || input.includes("service")) return "product";
if (input.includes("billing") || input.includes("payment")) return "billing";
return "general";
}
function extractUserName(input) {
const nameMatch = input.match(/(?:my name is|im|i am) (w+)/i);
return nameMatch ? nameMatch[1] : "";
}
workflow.addNode("generateResponse", (state) => {
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 youre facing some challenges. Lets see if we can turn things around. Whats on your mind?`;
} else {
response = `Hi ${userName}! Whats 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 youre having a technical hiccup, could you tell me whats 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 youre asking about. Dont worry, Ill keep it confidential.`;
break;
default:
followUp = `The more you can tell me, the better I can help. Whats on your mind?`;
}
return { ...state, output: state.output + " " + followUp };
});
workflow.addNode("adjustSentiment", (state) => {
const sentimentAdjusters = [
"Im 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.",
"Lets 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 days going well so far!",
"Just a heads up, Im 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 图状态的详细内容,更多请关注php中文网其它相关文章!