Compare commits

...

1 Commits

Author SHA1 Message Date
Marcus Schiesser 6de0ccc1fe feat: add scores to source nodes 2024-04-12 11:08:54 +08:00
10 changed files with 25 additions and 19 deletions
+5
View File
@@ -0,0 +1,5 @@
---
"llamaindex": patch
---
Add score to source nodes response
+3 -3
View File
@@ -1,14 +1,14 @@
import type { BaseNode } from "./Node.js";
import type { NodeWithScore } from "./Node.js";
/**
* Response is the output of a LLM
*/
export class Response {
response: string;
sourceNodes?: BaseNode[];
sourceNodes?: NodeWithScore[];
metadata: Record<string, unknown> = {};
constructor(response: string, sourceNodes?: BaseNode[]) {
constructor(response: string, sourceNodes?: NodeWithScore[]) {
this.response = response;
this.sourceNodes = sourceNodes || [];
}
@@ -113,10 +113,9 @@ export class ContextChatEngine extends PromptMixin implements ChatEngine {
});
const textOnly = extractText(message);
const context = await this.contextGenerator.generate(textOnly);
const nodes = context.nodes.map((r) => r.node);
const messages = await chatHistory.requestMessages(
context ? [context.message] : undefined,
);
return { nodes, messages };
return { nodes: context.nodes, messages };
}
}
+5 -5
View File
@@ -1,5 +1,5 @@
import type { ChatHistory } from "../../ChatHistory.js";
import type { BaseNode, NodeWithScore } from "../../Node.js";
import type { NodeWithScore } from "../../Node.js";
import type { Response } from "../../Response.js";
import type { ChatMessage } from "../../llm/index.js";
import type { MessageContent } from "../../llm/types.js";
@@ -66,12 +66,12 @@ export enum ChatResponseMode {
export class AgentChatResponse {
response: string;
sources: ToolOutput[];
sourceNodes?: BaseNode[];
sourceNodes?: NodeWithScore[];
constructor(
response: string,
sources?: ToolOutput[],
sourceNodes?: BaseNode[],
sourceNodes?: NodeWithScore[],
) {
this.response = response;
this.sources = sources || [];
@@ -91,12 +91,12 @@ export class StreamingAgentChatResponse {
response: AsyncIterable<Response>;
sources: ToolOutput[];
sourceNodes?: BaseNode[];
sourceNodes?: NodeWithScore[];
constructor(
response: AsyncIterable<Response>,
sources?: ToolOutput[],
sourceNodes?: BaseNode[],
sourceNodes?: NodeWithScore[],
) {
this.response = response;
this.sources = sources ?? [];
@@ -1,4 +1,4 @@
import type { BaseNode } from "../../Node.js";
import type { NodeWithScore } from "../../Node.js";
import { Response } from "../../Response.js";
import type { ServiceContext } from "../../ServiceContext.js";
import { llmFromSettingsOrContext } from "../../Settings.js";
@@ -33,7 +33,7 @@ async function combineResponses(
}
const responseStrs: string[] = [];
const sourceNodes: BaseNode[] = [];
const sourceNodes: NodeWithScore[] = [];
for (const response of responses) {
if (response?.sourceNodes) {
+1 -1
View File
@@ -111,7 +111,7 @@ export class CorrectnessEvaluator extends PromptMixin implements BaseEvaluator {
if (response) {
for (const node of response.sourceNodes || []) {
contexts.push(node.getContent(MetadataMode.ALL));
contexts.push(node.node.getContent(MetadataMode.ALL));
}
}
+1 -1
View File
@@ -137,7 +137,7 @@ export class FaithfulnessEvaluator
if (response) {
for (const node of response.sourceNodes || []) {
contexts.push(node.getContent(MetadataMode.ALL));
contexts.push(node.node.getContent(MetadataMode.ALL));
}
}
+1 -1
View File
@@ -126,7 +126,7 @@ export class RelevancyEvaluator extends PromptMixin implements BaseEvaluator {
if (response) {
for (const node of response.sourceNodes || []) {
contexts.push(node.getContent(MetadataMode.ALL));
contexts.push(node.node.getContent(MetadataMode.ALL));
}
}
@@ -91,6 +91,6 @@ export class MultiModalResponseSynthesizer
prompt,
});
return new Response(response.text, nodes);
return new Response(response.text, nodesWithScore);
}
}
@@ -69,19 +69,21 @@ export class ResponseSynthesizer
const textChunks: string[] = nodesWithScore.map(({ node }) =>
node.getContent(this.metadataMode),
);
const nodes = nodesWithScore.map(({ node }) => node);
if (stream) {
const response = await this.responseBuilder.getResponse({
query,
textChunks,
stream,
});
return streamConverter(response, (chunk) => new Response(chunk, nodes));
return streamConverter(
response,
(chunk) => new Response(chunk, nodesWithScore),
);
}
const response = await this.responseBuilder.getResponse({
query,
textChunks,
});
return new Response(response, nodes);
return new Response(response, nodesWithScore);
}
}