Skip to content

Commit a68391f

Browse files
mongodbenBen Perlmutter
andauthored
(EAI-989): Refactor verified answers to wrap GenerateResponse (#688)
verified answer generate response Co-authored-by: Ben Perlmutter <[email protected]>
1 parent f6fe862 commit a68391f

File tree

5 files changed

+123
-107
lines changed

5 files changed

+123
-107
lines changed

packages/chatbot-server-mongodb-public/src/config.ts

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ import {
1616
requireValidIpAddress,
1717
requireRequestOrigin,
1818
AddCustomDataFunc,
19-
makeVerifiedAnswerGenerateUserPrompt,
2019
makeDefaultFindVerifiedAnswer,
2120
defaultCreateConversationCustomData,
2221
defaultAddMessageToConversationCustomData,
2322
makeLegacyGeneratateResponse,
23+
makeVerifiedAnswerGenerateResponse,
2424
} from "mongodb-chatbot-server";
2525
import cookieParser from "cookie-parser";
2626
import { makeStepBackRagGenerateUserPrompt } from "./processors/makeStepBackRagGenerateUserPrompt";
@@ -174,8 +174,8 @@ export const preprocessorOpenAiClient = wrapOpenAI(
174174
})
175175
);
176176

177-
export const generateUserPrompt = wrapTraced(
178-
makeVerifiedAnswerGenerateUserPrompt({
177+
export const generateResponse = wrapTraced(
178+
makeVerifiedAnswerGenerateResponse({
179179
findVerifiedAnswer,
180180
onVerifiedAnswerFound: (verifiedAnswer) => {
181181
return {
@@ -184,11 +184,17 @@ export const generateUserPrompt = wrapTraced(
184184
};
185185
},
186186
onNoVerifiedAnswerFound: wrapTraced(
187-
makeStepBackRagGenerateUserPrompt({
188-
openAiClient: preprocessorOpenAiClient,
189-
model: retrievalConfig.preprocessorLlm,
190-
findContent,
191-
numPrecedingMessagesToInclude: 6,
187+
makeLegacyGeneratateResponse({
188+
llm,
189+
generateUserPrompt: makeStepBackRagGenerateUserPrompt({
190+
openAiClient: preprocessorOpenAiClient,
191+
model: retrievalConfig.preprocessorLlm,
192+
findContent,
193+
numPrecedingMessagesToInclude: 6,
194+
}),
195+
systemMessage: systemPrompt,
196+
llmNotWorkingMessage: "LLM not working. Sad!",
197+
noRelevantContentMessage: "No relevant content found. Sad!",
192198
}),
193199
{ name: "makeStepBackRagGenerateUserPrompt" }
194200
),
@@ -294,13 +300,7 @@ export const config: AppConfig = {
294300
: undefined,
295301
segment: segmentConfig,
296302
}),
297-
generateResponse: makeLegacyGeneratateResponse({
298-
llm,
299-
generateUserPrompt,
300-
systemMessage: systemPrompt,
301-
llmNotWorkingMessage: "LLM not working. Sad!",
302-
noRelevantContentMessage: "No relevant content found. Sad!",
303-
}),
303+
generateResponse,
304304
maxUserMessagesInConversation: 50,
305305
maxUserCommentLength: 500,
306306
conversations,

packages/mongodb-chatbot-server/src/processors/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ export * from "./QueryPreprocessorFunc";
44
export * from "./filterOnlySystemPrompt";
55
export * from "./makeDefaultReferenceLinks";
66
export * from "./makeFilterNPreviousMessages";
7-
export * from "./makeVerifiedAnswerGenerateUserPrompt";
7+
export * from "./makeVerifiedAnswerGenerateResponse";
88
export * from "./includeChunksForMaxTokensPossible";
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import { ObjectId } from "mongodb-rag-core/mongodb";
2+
import { makeVerifiedAnswerGenerateResponse } from "./makeVerifiedAnswerGenerateResponse";
3+
import { VerifiedAnswer, WithScore } from "mongodb-rag-core";
4+
5+
describe("makeVerifiedAnswerGenerateResponse", () => {
6+
const MAGIC_VERIFIABLE = "VERIFIABLE";
7+
const references = [
8+
{
9+
title: "title",
10+
url: "url",
11+
},
12+
];
13+
const generateResponse = makeVerifiedAnswerGenerateResponse({
14+
findVerifiedAnswer: async ({ query }) => {
15+
return {
16+
queryEmbedding: [1, 2, 3],
17+
answer:
18+
query === MAGIC_VERIFIABLE
19+
? ({
20+
answer: "verified answer",
21+
_id: "123",
22+
author_email: "[email protected]",
23+
created: new Date(),
24+
references,
25+
question: {
26+
text: "question",
27+
embedding: [1, 2, 3],
28+
embedding_model: "model",
29+
embedding_model_version: "version",
30+
},
31+
updated: new Date(),
32+
score: 1,
33+
} satisfies WithScore<VerifiedAnswer>)
34+
: undefined,
35+
};
36+
},
37+
onNoVerifiedAnswerFound: async () => {
38+
return {
39+
messages: [
40+
{
41+
role: "user",
42+
content: "returned from onNoVerifiedAnswerFound",
43+
},
44+
],
45+
};
46+
},
47+
});
48+
it("uses onNoVerifiedAnswerFound if no verified answer is found", async () => {
49+
// Given message text will not turn up verified answer
50+
const answer = await generateResponse({
51+
reqId: "",
52+
latestMessageText: "not verified",
53+
shouldStream: false,
54+
conversation: {
55+
_id: new ObjectId(),
56+
messages: [],
57+
createdAt: new Date(),
58+
},
59+
});
60+
expect(answer.messages).toHaveLength(1);
61+
expect(answer.messages[0].content).toBe(
62+
"returned from onNoVerifiedAnswerFound"
63+
);
64+
});
65+
it("uses verified answer if available, onNoVerifiedAnswerFound otherwise", async () => {
66+
// This will find a verified answer
67+
const answer = await generateResponse({
68+
reqId: "",
69+
latestMessageText: MAGIC_VERIFIABLE,
70+
shouldStream: false,
71+
conversation: {
72+
_id: new ObjectId(),
73+
messages: [],
74+
createdAt: new Date(),
75+
},
76+
});
77+
expect(answer.messages).toHaveLength(2);
78+
expect(answer.messages[0].content).toBe(MAGIC_VERIFIABLE);
79+
});
80+
});
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
1-
import { VerifiedAnswer, FindVerifiedAnswerFunc } from "mongodb-rag-core";
21
import {
3-
GenerateUserPromptFunc,
4-
GenerateUserPromptFuncReturnValue,
5-
} from "../routes/legacyGenerateResponse";
2+
VerifiedAnswer,
3+
FindVerifiedAnswerFunc,
4+
SomeMessage,
5+
} from "mongodb-rag-core";
6+
import {
7+
GenerateResponse,
8+
GenerateResponseReturnValue,
9+
} from "../routes/conversations/addMessageToConversation";
610

7-
export interface MakeVerifiedAnswerGenerateUserPromptParams {
11+
export interface MakeVerifiedAnswerGenerateResponseParams {
812
/**
913
Find content based on the user's message and preprocessing.
1014
*/
@@ -15,24 +19,24 @@ export interface MakeVerifiedAnswerGenerateUserPromptParams {
1519
*/
1620
onVerifiedAnswerFound?: (verifiedAnswer: VerifiedAnswer) => VerifiedAnswer;
1721

18-
onNoVerifiedAnswerFound: GenerateUserPromptFunc;
22+
onNoVerifiedAnswerFound: GenerateResponse;
1923
}
2024

2125
/**
22-
Constructs a GenerateUserPromptFunc that searches for verified answers for the
23-
user query. If no verified answer can be found for the given query, the
24-
onNoVerifiedAnswerFound GenerateUserPromptFunc is called instead.
26+
Searches for verified answers for the user query.
27+
If no verified answer can be found for the given query, the
28+
`onNoVerifiedAnswerFound` function is called instead.
2529
*/
26-
export const makeVerifiedAnswerGenerateUserPrompt = ({
30+
export const makeVerifiedAnswerGenerateResponse = ({
2731
findVerifiedAnswer,
2832
onVerifiedAnswerFound,
2933
onNoVerifiedAnswerFound,
30-
}: MakeVerifiedAnswerGenerateUserPromptParams): GenerateUserPromptFunc => {
34+
}: MakeVerifiedAnswerGenerateResponseParams): GenerateResponse => {
3135
return async (args) => {
32-
const { userMessageText } = args;
36+
const { latestMessageText } = args;
3337
const { answer: foundVerifiedAnswer, queryEmbedding } =
3438
await findVerifiedAnswer({
35-
query: userMessageText,
39+
query: latestMessageText,
3640
});
3741

3842
if (foundVerifiedAnswer === undefined) {
@@ -41,25 +45,25 @@ export const makeVerifiedAnswerGenerateUserPrompt = ({
4145

4246
const verifiedAnswer =
4347
onVerifiedAnswerFound?.(foundVerifiedAnswer) ?? foundVerifiedAnswer;
44-
return {
45-
userMessage: {
46-
embedding: queryEmbedding,
47-
content: userMessageText,
48+
const messages = [
49+
{
4850
role: "user",
51+
embedding: queryEmbedding,
52+
content: latestMessageText,
4953
},
50-
references: verifiedAnswer.references,
51-
staticResponse: {
54+
{
55+
role: "assistant",
56+
content: verifiedAnswer.answer,
57+
references: verifiedAnswer.references,
5258
metadata: {
5359
verifiedAnswer: {
5460
_id: verifiedAnswer._id,
5561
created: verifiedAnswer.created,
5662
updated: verifiedAnswer.updated,
5763
},
5864
},
59-
references: verifiedAnswer.references,
60-
content: verifiedAnswer.answer,
61-
role: "assistant",
6265
},
63-
} satisfies GenerateUserPromptFuncReturnValue;
66+
] satisfies SomeMessage[];
67+
return { messages } satisfies GenerateResponseReturnValue;
6468
};
6569
};

packages/mongodb-chatbot-server/src/processors/makeVerifiedAnswerGenerateUserPrompt.test.ts

Lines changed: 0 additions & 68 deletions
This file was deleted.

0 commit comments

Comments
 (0)