Comments (11)
お問い合わせありがとうございます!
現在、RAGチャット時のKendra検索は、Retrieve APIを利用しているためFAQが検索できない仕様となっております。
https://docs.aws.amazon.com/ja_jp/kendra/latest/APIReference/API_Retrieve.html
This doesn't include question-answer or FAQ type responses from your index.
Query APIだとFAQを検索できますので、以下のように実装いただければと思います。
const faq = await (
await query(searchQuery)
).data.ResultItems?.filter((item) => item.Type === 'QUESTION_ANSWER'); // <= これを追加して、referenceItemsに渡す
generative-ai-use-cases-jp/packages/web/src/prompts/index.ts
Lines 166 to 170 in 7d20632
export type RagParams = {
promptType: 'RETRIEVE' | 'SYSTEM_CONTEXT';
retrieveQueries?: string[];
referenceItems?: (RetrieveResultItem | QueryResultItem)[];
};
generative-ai-use-cases-jp/packages/web/src/prompts/index.ts
Lines 214 to 224 in 7d20632
// 以下のように修正
${params
.referenceItems!.map((item) => {
return `${JSON.stringify({
DocumentId: item.DocumentId,
DocumentTitle: item.DocumentTitle,
DocumentURI: item.DocumentURI,
Content: (item as RetrieveResultItem).Content
? (item as RetrieveResultItem).Content
: (item as QueryResultItem).AdditionalAttributes?.find(
(a) => a.Key === 'AnswerText'
),
})}`;
})
.join(',\n')}
FAQの正式対応については、検討させていただきます!
from generative-ai-use-cases-jp.
お世話になっております
ご教授ありがとうございます
いただきました、アドバイスについて一点、ご教授をお願いできますと幸いです
上記のコードの部分を以下の通りに変更をするという理解でよろしかったでしょうか
const faq = await (
await query(searchQuery)
).data.ResultItems?.filter((item) => item.Type === 'QUESTION_ANSWER'); // <= これを追加して、referenceItemsに渡す
上記のコードを46行目に差し込みますと、VS Studio Codeで添付の画像のような形でErrorが発生するのですがこれはどの様に対応すればよいかご教授いただけますと幸いです
どうぞよろしくお願い申し上げます
from generative-ai-use-cases-jp.
以下のように修正いただくとどうでしょうか?
// Kendra から 参考ドキュメントを Retrieve してシステムコンテキストとして設定する
const retrievedItems = await retrieve(searchQuery);
const faq = await (
await query(searchQuery)
).data.ResultItems?.filter((item) => item.Type === 'QUESTION_ANSWER');
updateSystemContext(
ragPrompt({
promptType: 'SYSTEM_CONTEXT',
referenceItems: [
...(retrievedItems.data.ResultItems ?? []),
...(faq ?? []),
],
})
);
from generative-ai-use-cases-jp.
早速のご教授、ありがとうございます!
いただきましたコードを既存のコードと差し替えますと、添付の様な状況になります
ご確認とご教授いただけますと幸いです
よろしくお願い申し上げます
from generative-ai-use-cases-jp.
小出しにしてすみません!
以下が全文です。こちらでいかがでしょうか?
import useChat from './useChat';
import useChatApi from './useChatApi';
import useRagApi from './useRagApi';
import { ragPrompt } from '../prompts';
const useRag = (id: string) => {
const {
messages,
postChat,
clear,
loading,
setLoading,
updateSystemContext,
popMessage,
pushMessage,
isEmpty,
} = useChat(id);
const { retrieve, query } = useRagApi();
const { predict } = useChatApi();
return {
isEmpty,
clear,
loading,
messages,
postMessage: async (content: string) => {
// Kendra から Retrieve する際に、ローディング表示する
setLoading(true);
pushMessage('user', content);
pushMessage('assistant', '[Kendra から参照ドキュメントを取得中...]');
const searchQuery = await predict({
messages: [
{
role: 'user',
content: ragPrompt({
promptType: 'RETRIEVE',
retrieveQueries: [content],
}),
},
],
});
// Kendra から 参考ドキュメントを Retrieve してシステムコンテキストとして設定する
const retrievedItems = await retrieve(searchQuery);
const faq = await (
await query(searchQuery)
).data.ResultItems?.filter((item) => item.Type === 'QUESTION_ANSWER');
updateSystemContext(
ragPrompt({
promptType: 'SYSTEM_CONTEXT',
referenceItems: [
...(retrievedItems.data.ResultItems ?? []),
...(faq ?? []),
],
})
);
// ローディング表示を消してから通常のチャットの POST 処理を実行する
popMessage();
popMessage();
postChat(content);
},
};
};
export default useRag;
from generative-ai-use-cases-jp.
ありがとうございます!
itemの型が無いので、Errorになっているようなのですが、以下の様に変更しても良いでしょうか
上記の様に変更をすると、Errorは全て解消できます
ご教授をよろしくお願い申し上げます
from generative-ai-use-cases-jp.
私の貼ったコードはあくまで実装例ですので、ご自由に改廃いただいて問題ございません!
from generative-ai-use-cases-jp.
ありがとうございます!
いただきましたコードでdeployをして、後ほど、結果をご報告させて頂きます
ご教授ありがとうございます
from generative-ai-use-cases-jp.
お世話になっております
いただきました、コードを改変してdeployをした所、RAGチャットでFAQsの内容を確認することができました
const retrievedItems = await retrieve(searchQuery);
const faq = await (
await query(searchQuery)
).data.ResultItems?.filter((item: {Type: string}) => item.Type === 'QUESTION_ANSWER'); //この部分
${params
.referenceItems!.map((item) => {
return `${JSON.stringify({
DocumentId: item.DocumentId,
DocumentTitle: item.DocumentTitle,
DocumentURI: item.DocumentURI,
Content: (item as RetrieveResultItem).Content
? (item as RetrieveResultItem).Content
: (item as QueryResultItem).AdditionalAttributes?.find(
(a: { Key: string }) => a.Key === 'AnswerText' //この部分
),
})}`;
})
.join(',\n')}
上記の「この部分」で型宣言をすると、CDKがErrorになったので、型宣言を削除するとcdk deployも問題なく行えました
ぜひ、本機能の実装についても前向きなご検討をいただけますと幸いです
この度はご指導、誠にありがとうございました
引き続きよろしくお願い申し上げます
from generative-ai-use-cases-jp.
@wadabee
お世話になっております
本件について、改めて質問をさせてください
最新のgenerative-ai-use-cases-jpのリポジトリでkendraのfaqsを利用できるように、ご教授いただきましたコードの改変をおこなったのですが、index.tsで添付の通りのErrorとなってしまいます
一旦、この状態で、cloud9から以下のコマンドでcdkをbuildしたのですが、いかの様なErrorになってしまいます
誠にお忙しいところ、恐縮ですがこれはどのようにすれば解決ができますでしょうか
ご指導をいただけますと助かります
どうぞよろしくお願いもうしあげます
from generative-ai-use-cases-jp.
上で提示されている実装とは異なる部分がいくつかありますが、以下の実装でFAQを含むRAGが行えますので参考にしていただければと思います。aws-samples/generative-ai-use-cases-jp/packages/web/src/hooks/useRag.ts
を以下に置き換えてみてください。
import { RetrieveResultItem } from '@aws-sdk/client-kendra';
import { Model, ShownMessage } from 'generative-ai-use-cases-jp';
import { ragPrompt } from '../prompts';
import useChat from './useChat';
import useChatApi from './useChatApi';
import useRagApi from './useRagApi';
const useRag = (id: string) => {
const {
messages,
postChat,
clear,
loading,
setLoading,
updateSystemContext,
popMessage,
pushMessage,
isEmpty,
} = useChat(id);
const { retrieve, query } = useRagApi();
const { predict } = useChatApi();
return {
isEmpty,
clear,
loading,
messages,
postMessage: async (content: string, model: Model) => {
// Kendra から Retrieve する際に、ローディング表示する
setLoading(true);
pushMessage('user', content);
pushMessage('assistant', 'Kendra から参照ドキュメントを取得中...');
const queryContent = await predict({
model: model,
messages: [
{
role: 'user',
content: ragPrompt.generatePrompt({
promptType: 'RETRIEVE',
retrieveQueries: [content],
}),
},
],
});
// Kendra から 参考ドキュメントを Retrieve してシステムコンテキストとして設定する
const retrieveItemsp = retrieve(queryContent);
const queryItemsp = query(queryContent)
const [retrieveItems, queryItems] = await Promise.all([retrieveItemsp, queryItemsp])
console.log({
retrieveResult: retrieveItems
})
console.log({
queryResult: queryItems
})
const faqs: RetrieveResultItem[] = queryItems.data.ResultItems?.filter((item) => item.Type === 'QUESTION_ANSWER').map((item)=>{
const res = {
Content: item.DocumentExcerpt?.Text || "",
Id: item.Id,
DocumentId: item.DocumentId,
DocumentTitle: item.DocumentTitle?.Text || "",
DocumentURI: item.DocumentURI,
DocumentAttributes: item.DocumentAttributes,
ScoreAttributes: item.ScoreAttributes
}
console.log({
faq:res
})
return res
})||[];
if ((retrieveItems.data.ResultItems ?? []).length === 0) {
popMessage();
pushMessage(
'assistant',
`参考ドキュメントが見つかりませんでした。次の対応を検討してください。
- Amazon Kendra の data source に対象のドキュメントが追加されているか確認する
- Amazon Kendra の data source が sync されているか確認する
- 入力の表現を変更する`
);
setLoading(false);
return;
}
updateSystemContext(
ragPrompt.generatePrompt({
promptType: 'SYSTEM_CONTEXT',
referenceItems: [...retrieveItems.data.ResultItems!, ...faqs!] ?? [],
})
);
// ローディング表示を消してから通常のチャットの POST 処理を実行する
popMessage();
popMessage();
postChat(
content,
false,
model,
(messages: ShownMessage[]) => {
// 前処理:Few-shot で参考にされてしまうため、過去ログから footnote を削除
return messages.map((message) => ({
...message,
content: message.content.replace(/\[\^(\d+)\]:.*/g, ''),
}));
},
(message: string) => {
// 後処理:Footnote の付与
const footnote = retrieveItems.data.ResultItems?.map((item, idx) => {
// 参考にしたページ番号がある場合は、アンカーリンクとして設定する
const _excerpt_page_number = item.DocumentAttributes?.find(
(attr) => attr.Key === '_excerpt_page_number'
)?.Value?.LongValue;
return message.includes(`[^${idx}]`)
? `[^${idx}]: [${item.DocumentTitle}${
_excerpt_page_number ? `(${_excerpt_page_number} ページ)` : ''
}](${item.DocumentURI}${
_excerpt_page_number ? `#page=${_excerpt_page_number}` : ''
})`
: '';
})
.filter((x) => x)
.join('\n');
return message + '\n' + footnote;
}
);
},
};
};
export default useRag;
動作確認用のconsole.log()を三箇所あえて残しておりますので、適宜削除いただければと思います。また、FAQにおけるQuestion側をコンテキストに含めるかどうかなど、上記実装に関してまだまだ考慮点はあるかと思いますので適宜修正ください。
以上、参考になれば幸いです。
from generative-ai-use-cases-jp.
Related Issues (20)
- RAGチャットの署名付きリンクが日本語名を含むファイルだとエラーになる HOT 1
- [機能要望]ユースケース「チャット」の音声入力機能
- 【質問】RAGにおける検索クエリ指定の差異について HOT 2
- cross region inference の対応
- 出力がスタックする問題 HOT 1
- 翻訳結果の音声出力多言語対応 HOT 3
- ファイルの個別Upload機能(PowerPoint対応)
- Guardrailの更新が反映されない
- 【要望】1つのAWSアカウントに複数個の機能をデプロイしたい HOT 5
- 【要望】クロスリージョン推論対応 HOT 3
- 【不具合報告】出力が途中で途切れる
- cdk.json から AgentRegion をなくす
- 【要望】アプリケーションへのタグ付け HOT 3
- 【要望】Storage Browser for Amazon S3
- [機能要望] Knowledge Bases for Amazon Bedrock メタデータフィルタリングのサポート
- Bad ボタンの充実 HOT 1
- ミニマムアクションでデプロイ可能な方法の確立
- Cognito を利用したログインで MFA の導入
- Stable Image Ultra、Stable Diffusion 3 Large、Stable Image Coreの追加について
- RAGチャットを有効化しても Bedrock ナレッジベースが作成されない HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from generative-ai-use-cases-jp.