项目文件夹

文件
wehub-resource-sync e768098d0e
tools_continuous_delivery / Private PyPI non-main branch release (push) Has been skipped
tools_continuous_delivery / Private PyPI main branch release (push) Failing after 2m42s
Publish Promptflow Doc / Build (push) Has been cancelled
Publish Promptflow Doc / Deploy (push) Has been cancelled
Flake8 Lint / flake8 (push) Has been cancelled
Spell check CI / Spell_Check (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:39:52 +08:00

330 行
9.0 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Chat with PDF in Azure"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"This is a simple flow that allow you to ask questions about the content of a PDF file and get answers.\n",
"You can run the flow with a URL to a PDF file and question as argument.\n",
"Once it's launched it will download the PDF and build an index of the content. \n",
"Then when you ask a question, it will look up the index to retrieve relevant content and post the question with the relevant content to OpenAI chat model (gpt-3.5-turbo or gpt4) to get an answer.\n",
"\n",
"## 0. Install dependencies"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%pip install -r requirements.txt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 1. Connect to Azure Machine Learning Workspace"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from azure.identity import DefaultAzureCredential, InteractiveBrowserCredential\n",
"\n",
"try:\n",
" credential = DefaultAzureCredential()\n",
" # Check if given credential can get token successfully.\n",
" credential.get_token(\"https://management.azure.com/.default\")\n",
"except Exception as ex:\n",
" # Fall back to InteractiveBrowserCredential in case DefaultAzureCredential not work\n",
" credential = InteractiveBrowserCredential()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1.1 Get familiar with the primary interface - PFClient"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import promptflow.azure as azure\n",
"\n",
"# Get a handle to workspace\n",
"pf = azure.PFClient.from_config(credential=credential)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1.2 Create necessary connections\n",
"\n",
"Connection in prompt flow is for managing settings of your application behaviors incl. how to talk to different services (Azure OpenAI for example).\n",
"\n",
"Prepare your Azure OpenAI resource follow this [instruction](https://learn.microsoft.com/en-us/azure/cognitive-services/openai/how-to/create-resource?pivots=web-portal) and get your `api_key` if you don't have one.\n",
"\n",
"Please go to [workspace portal](https://ml.azure.com/), click `Prompt flow` -> `Connections` -> `Create`, then follow the instruction to create your own connections. \n",
"Learn more on [connections](https://learn.microsoft.com/en-us/azure/machine-learning/prompt-flow/concept-connections?view=azureml-api-2)."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"conn_name = \"open_ai_connection\"\n",
"\n",
"# TODO integrate with azure.ai sdk\n",
"# currently we only support create connection in Azure ML Studio UI\n",
"# raise Exception(f\"Please create {conn_name} connection in Azure ML Studio.\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 2. Run a flow with setting (context size 2K)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"flow_path = \".\"\n",
"data_path = \"./data/bert-paper-qna-3-line.jsonl\"\n",
"\n",
"config_2k_context = {\n",
" \"EMBEDDING_MODEL_DEPLOYMENT_NAME\": \"text-embedding-ada-002\",\n",
" \"CHAT_MODEL_DEPLOYMENT_NAME\": \"gpt-35-turbo\",\n",
" \"PROMPT_TOKEN_LIMIT\": 2000,\n",
" \"MAX_COMPLETION_TOKENS\": 256,\n",
" \"VERBOSE\": True,\n",
" \"CHUNK_SIZE\": 1024,\n",
" \"CHUNK_OVERLAP\": 32,\n",
"}\n",
"\n",
"column_mapping = {\n",
" \"question\": \"${data.question}\",\n",
" \"pdf_url\": \"${data.pdf_url}\",\n",
" \"chat_history\": \"${data.chat_history}\",\n",
" \"config\": config_2k_context,\n",
"}\n",
"\n",
"run_2k_context = pf.run(\n",
" flow=flow_path,\n",
" data=data_path,\n",
" column_mapping=column_mapping,\n",
" display_name=\"chat_with_pdf_2k_context\",\n",
" tags={\"chat_with_pdf\": \"\", \"1st_round\": \"\"},\n",
")\n",
"pf.stream(run_2k_context)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(run_2k_context)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"detail = pf.get_details(run_2k_context)\n",
"\n",
"detail"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 3. Evaluate the \"groundedness\"\n",
"The `eval-groundedness flow` is using ChatGPT/GPT4 model to grade the answers generated by chat-with-pdf flow."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"eval_groundedness_flow_path = \"../../evaluation/eval-groundedness/\"\n",
"eval_groundedness_2k_context = pf.run(\n",
" flow=eval_groundedness_flow_path,\n",
" run=run_2k_context,\n",
" column_mapping={\n",
" \"question\": \"${run.inputs.question}\",\n",
" \"answer\": \"${run.outputs.answer}\",\n",
" \"context\": \"${run.outputs.context}\",\n",
" },\n",
" display_name=\"eval_groundedness_2k_context\",\n",
")\n",
"pf.stream(eval_groundedness_2k_context)\n",
"\n",
"print(eval_groundedness_2k_context)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 4. Try a different configuration and evaluate again - experimentation\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"flow_path = \".\"\n",
"data_path = \"./data/bert-paper-qna-3-line.jsonl\"\n",
"\n",
"config_3k_context = {\n",
" \"EMBEDDING_MODEL_DEPLOYMENT_NAME\": \"text-embedding-ada-002\",\n",
" \"CHAT_MODEL_DEPLOYMENT_NAME\": \"gpt-35-turbo\",\n",
" \"PROMPT_TOKEN_LIMIT\": 3000, # different from 2k context\n",
" \"MAX_COMPLETION_TOKENS\": 256,\n",
" \"VERBOSE\": True,\n",
" \"CHUNK_SIZE\": 1024,\n",
" \"CHUNK_OVERLAP\": 32,\n",
"}\n",
"\n",
"column_mapping = {\n",
" \"question\": \"${data.question}\",\n",
" \"pdf_url\": \"${data.pdf_url}\",\n",
" \"chat_history\": \"${data.chat_history}\",\n",
" \"config\": config_3k_context,\n",
"}\n",
"run_3k_context = pf.run(\n",
" flow=flow_path,\n",
" data=data_path,\n",
" column_mapping=column_mapping,\n",
" display_name=\"chat_with_pdf_3k_context\",\n",
" tags={\"chat_with_pdf\": \"\", \"2nd_round\": \"\"},\n",
")\n",
"pf.stream(run_3k_context)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(run_3k_context)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"detail = pf.get_details(run_3k_context)\n",
"\n",
"detail"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"eval_groundedness_3k_context = pf.run(\n",
" flow=eval_groundedness_flow_path,\n",
" run=run_3k_context,\n",
" column_mapping={\n",
" \"question\": \"${run.inputs.question}\",\n",
" \"answer\": \"${run.outputs.answer}\",\n",
" \"context\": \"${run.outputs.context}\",\n",
" },\n",
" display_name=\"eval_groundedness_3k_context\",\n",
")\n",
"pf.stream(eval_groundedness_3k_context)\n",
"\n",
"print(eval_groundedness_3k_context)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"pf.get_details(eval_groundedness_3k_context)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"pf.visualize([eval_groundedness_2k_context, eval_groundedness_3k_context])"
]
}
],
"metadata": {
"build_doc": {
"author": [
"wangchao1230@github.com",
"ttthree@github.com"
],
"category": "azure",
"section": "Rag",
"weight": 10
},
"description": "A tutorial of chat-with-pdf flow that executes in Azure AI",
"kernelspec": {
"display_name": "prompt-flow",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.17"
},
"stage": "development"
},
"nbformat": 4,
"nbformat_minor": 2
}