How Can I display Reference/Citation using Streamlit Application?

news2025/1/25 4:37:39

题意:怎样在Streamlit应用程序中显示参考文献或引用?

问题背景:

I have created an Azure AI Search Service, created index using Azure Blob Storage and Deployed a web application and made a chat Playground using AzureOpenAI.

我已经创建了一个Azure AI搜索服务,使用Azure Blob Storage创建了索引,并部署了一个Web应用程序,还使用AzureOpenAI制作了一个聊天游乐场。

Similarly, I have made a streamlit Application using VS Code. The application is like I will upload document, ask a query and will get an answer based on uploaded document using azure ai search index and azureopenai. But, One thing that I want is below answer, I want Reference/Citation to be displayed.

同样地,我使用VS Code制作了一个Streamlit应用程序。该应用程序的功能是,我可以上传文档,提出问题,然后基于上传的文档,利用Azure AI搜索索引和AzureOpenAI得到答案。但是,我希望的是,在答案下方能够显示参考/引用信息。

It should be the page/source information from where answer is extracted.

它应该是从中提取答案的页面/源信息。

The fields in my Index are:        我索引中的字段包括:

content: Full text content of the document. metadata_storage_path: Path where the document is stored. metadata_author: Author of the document. metadata_title: Title of the document. metadata_creation_date: Creation date of the document. language: Language of the document. split_text: Segmented parts of the document text. keywords: Keywords extracted from the document. summary: Summary of the document content. section_titles: Titles of sections within the document. metadata_file_type: File type of the document (e.g., PDF, DOCX). merged_content: Combined content from different parts of the document. text: Main text of the document. layoutText: Text layout information of the document.

我的索引中的字段包括:

  • content: 文档的全文内容。
  • metadata_storage_path: 文档存储的路径。
  • metadata_author: 文档的作者。
  • metadata_title: 文档的标题。
  • metadata_creation_date: 文档的创建日期。
  • language: 文档的语言。
  • split_text: 文档文本的分割部分。
  • keywords: 从文档中提取的关键词。
  • summary: 文档内容的摘要。
  • section_titles: 文档内部各节的标题。
  • metadata_file_type: 文档的文件类型(例如,PDF、DOCX)。
  • merged_content: 来自文档不同部分的合并内容。
  • text: 文档的主要文本。
  • layoutText: 文档的文本布局信息。

My Code is here:        下面是我的代码:

import os
import streamlit as st
from openai import AzureOpenAI
from azure.identity import AzureCliCredential
from azure.core.credentials import AccessToken

# Environment variables
endpoint = os.getenv("ENDPOINT_URL", "https://****************.azure.com/")
deployment = os.getenv("DEPLOYMENT_NAME", "openai-gpt-35-1106")
search_endpoint = os.getenv("SEARCH_ENDPOINT", "https://****************windows.net")
search_key = os.getenv("SEARCH_KEY", ********************************)
search_index = os.getenv("SEARCH_INDEX_NAME", "azureblob-index")

# Setup Azure OpenAI client
credential = AzureCliCredential()

def get_bearer_token() -> str:
    token = credential.get_token("https://****************windows.net")
    return token.token

client = AzureOpenAI(
    azure_endpoint=endpoint,
    azure_ad_token_provider=get_bearer_token,
    api_version="2024-05-01-preview"
)

# Streamlit UI
st.title("Document Uploader and Query Tool")

# File upload
uploaded_file = st.file_uploader("Upload a document", type=["pdf", "docx", "pptx", "xlsx", "txt"])

if uploaded_file is not None:
    file_content = uploaded_file.read()
    st.write("Document uploaded successfully!")

# Send query to Azure AI Search and OpenAI
query = st.text_input("Enter your query:")

if st.button("Get Answer"):
    if query:
        try:
            completion = client.chat.completions.create(
                model=deployment,
                messages=[
                    {
                        "role": "user",
                        "content": query
                    }
                ],
                max_tokens=800,
                temperature=0,
                top_p=1,
                frequency_penalty=0,
                presence_penalty=0,
                stop=None,
                stream=False,
                extra_body={
                    "data_sources": [{
                        "type": "azure_search",
                        "parameters": {
                            "endpoint": search_endpoint,
                            "index_name": search_index,
                            "semantic_configuration": "docs_test",
                            "query_type": "semantic",
                            "fields_mapping": {
                                "content_fields_separator": "\n",
                                "content_fields": ["content", "merged_content"]
                            },
                            "in_scope": True,
                            "role_information": "You are an AI assistant that helps people find information. The information should be small and crisp. It should be accurate.",
                            "authentication": {
                                "type": "api_key",
                                "key": search_key
                            }
                        }
                    }]
                }
            )

            response = completion.to_dict()
            answer = response["choices"][0]["message"]["content"]

            references = []
            if "references" in response["choices"][0]["message"]:
                references = response["choices"][0]["message"]["references"]

            st.write("Response from OpenAI:")
            st.write(answer)

            if references:
                st.write("References:")
                for i, ref in enumerate(references):
                    st.write(f"{i + 1}. {ref['title']} ({ref['url']})")

        except Exception as e:
            st.error(f"Error: {e}")
    else:
        st.warning("Please enter a query.")

The answer that I am getting is like below:        我得到的答案如下:

The primary purpose of Tesla's existence, as stated in the 2019 Impact Report, is to accelerate the world's transition to sustainable energy [doc1]. This mission is aimed at minimizing the environmental impact of products and their components, particularly in the product-use phase, by providing information on both the manufacturing and consumer-use aspects of Tesla products [doc1].

正如2019年影响力报告所述,特斯拉存在的主要目的是加速世界向可持续能源的转型[doc1]。特斯拉的这一使命旨在通过提供特斯拉产品在生产和消费者使用方面的信息,来最小化产品及其组件对环境的影响,特别是在产品使用阶段[doc1]。

the [doc1] is placeholder of source information. But I want it to be like:

这里的“[doc1]”是源信息的占位符。但我想让它像这样:

Reference: the source information/page from where answer is extracted.

参考:答案被提取的源信息/页面。

Can you help.        谁能提供帮助?

Thanks in Advance!!!!!        非常感谢

问题解决:

You can use below code to extract title name and url from references.

你可以使用下面的代码来从参考文献中提取标题名称和URL

Actually, the [doc1] itself the reference which is in content of the message object.

实际上,[doc1] 本身就是消息对象中内容部分的引用。

doc1 in the sense 1st document in citations dictionary.

doc1”在意义上指的是“citations”字典中的第一个文档

So, below code helps you extract it.        所以,下面的代码可以帮助你提取它。

First, find out the unique references.        首先,找出唯一的引用。

import re

pattern = r'\[(.*?)\]'
text = simple_res.choices[0].message.content
matches = re.findall(pattern, text)
documents = list(set([match for match in matches if match.startswith('doc')]))

print(documents)

Output:        输出

['doc1']

Next, create a dictionary of citation. The result citation will be mapped increasing order like doc1 is first citation and doc2 is second citation and so on.

接下来,创建一个引用字典。结果中的引用将按照递增顺序映射,比如“doc1”是第一个引用,“doc2”是第二个引用,依此类推。

references = {}
for i,j in enumerate(simple_res.choices[0].message.context['citations']):
    references[f"doc{i+1}"] =j

Now fetch the title and url.        现在获取标题和URL。

if references:
    print("References:")
    for i, ref in enumerate(documents):
        print(f"{i + 1}. {references[ref]['title']} ({references[ref]['url']})")

Output:        输出:

References:
1. 78782543_7_23_24.html (https://xxxxx.blob.core.windows.net/data/pdf/78782543_7_23_24.html)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1969842.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS使用渐变实现Chrome标签栏效果

这次来看一个带特殊圆角导航栏布局,如下谷歌浏览器的标签栏: 这样一个布局如何实现呢? CSS 渐变几乎是无所不能的,什么的图形都能绘制,这里可以拆分一下,两个矩形,两个圆形,还有两个…

计算机毕业设计选题推荐-二手闲置交易系统-Java/Python项目实战

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

目标检测 | yolov2/yolo9000 原理和介绍

前言:目标检测 | yolov1 原理和介绍 简介 论文链接:https://arxiv.org/abs/1612.08242 时间:2016年 作者:Joseph Redmon  作者首先在YOLOv1的基础上提出了改进的YOLOv2,然后提出了一种检测与分类联合训练方法&#…

【Linux网络编程】套接字Socket(UDP)

网络编程基础概念: ip地址和端口号 ip地址是网络协议地址(4字节32位,形式:xxx.xxx.xxx.xxx xxx在范围[0, 255]内),是IP协议提供的一种统一的地址格式,每台主机的ip地址不同,一个…

五个优秀的免费 Ollama WebUI 客户端推荐

认识 Ollama 本地模型框架,并简单了解它的优势和不足,以及推荐了 5 款开源免费的 Ollama WebUI 客户端,以提高使用体验。 什么是 Ollama? Ollama 是一款强大的本地运行大型语言模型(LLM)的框架&#xff0c…

一键操作!Win11用户将排除项添加到安全中心的方法

在Win11电脑操作中,Windows安全中心提供了添加排除项的功能,让用户可以自定义哪些文件、文件夹或进程免于Microsoft Defender的扫描,从而防止误报正常程序为安全威胁。但许多新手不知道具体如何操作才能成功添加排除项?那么就来看…

【PGCCC】pg_show_plans:显示所有正在运行的语句的查询计划

PostgreSQL 扩展可显示所有当前正在运行的 SQL 语句的查询计划。查询计划可以以多种格式显示,例如JSON或YAML。 此扩展在共享内存中创建哈希表。哈希表不可调整大小,因此一旦填满,就无法添加新计划。 安装 支持 PostgreSQL 版本 12 及更新…

学Python可少不了项目练手,这8个小项目有趣又实用,小白也能做出来_python练手项目,python教程

学习之路比较科学的学习方法是理解了之后把知识点进行运用,找一些开源的小项目做是最好的,站在岸上是学不会游泳的,光看健身视频是减不了肥的,不自己动手敲代码是学不会编程的。 我在找了8个比较有趣的小项目,技术水平…

DirectX修复工具下载安装指南:电脑dll修复拿下!6种dll缺失修复方法!

在日常使用电脑的过程中,不少用户可能会遇到“DLL文件缺失”的错误提示,这类问题往往导致程序无法正常运行或系统出现不稳定现象。幸运的是,DirectX修复工具作为一款功能强大的系统维护软件,能够有效解决大多数DLL文件缺失问题&am…

下属“软对抗”,工作阳奉阴违怎么办?4大权谋术,让他不敢造次

下属“软对抗”,工作阳奉阴违怎么办?4大权谋术,让他不敢造次 第一个:强势管理 在企业管理中,领导必须展现足够的强势。 所谓强势的管理,并不仅仅指态度上的强硬,更重要的是在行动中坚持原则和规…

元气森林|每天拆解一个品牌营销方案

元气森林的品牌营销策略是一个多维度、全方位的策略体系,旨在通过创新、用户导向和多元化渠道来塑造和提升品牌形象,促进产品销售。 以下是道叔对元气森林品牌营销策略的详细拆解: 一、以用户为中心的营销理念 元气森林注重通过市场调研、…

Java | Leetcode Java题解之第313题超级丑数

题目&#xff1a; 题解&#xff1a; class Solution {public int nthSuperUglyNumber(int n, int[] primes) {int[] dp new int[n 1];int m primes.length;int[] pointers new int[m];int[] nums new int[m];Arrays.fill(nums, 1);for (int i 1; i < n; i) {int minN…

浅谈莫比乌斯反演(c++)

目录 前置知识一些约定数论分块狄利克雷卷积定义一些常见的狄利克雷卷积 莫比乌斯反演莫比乌斯函数的性质/莫比乌斯变换 例题讲解公约数的和题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示数据规模与约定 思路 AC代码[HAOI2011] Problem b题目描述输入格…

Kimi+AiPPT的正确打开方式!文档一键转换PPT!限时免费!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,专注于分享AI全维度知识,包括但不限于AI科普,AI工具测评,AI效率提升,AI行业洞察。关注我,AI之路不迷路,2024我们一起变强。 我之前…

C++ | Leetcode C++题解之第313题超级丑数

题目&#xff1a; 题解&#xff1a; class Solution { public:int nthSuperUglyNumber(int n, vector<int>& primes) {vector<long> dp(n 1);int m primes.size();vector<int> pointers(m, 0);vector<long> nums(m, 1);for (int i 1; i < n…

【glomap】glomap install tutorial

【glomap】glomap install tutorial 1. install step by office2. install step3. reason方法1&#xff1a;修改目标GPU架构方法2&#xff1a;更新CUDA工具包方法3&#xff1a;在CMake中手动设置CUDA编译选项 4 reference 1. install step by office mkdir build cd build cma…

视频驱动数字人形象,LivePortrait最新模型分享

LivePortrait是一个由快手可灵团队开发的高级人工智能肖像动画框架&#xff0c;其主要功能是使静态照片中的面部能够模仿动态视频中的表情变化&#xff0c;从而让照片看起来像是活生生的人在做表情。 LivePortrait采用了基于隐式关键点的方法&#xff0c;而不是传统的扩散方法…

报表系统之Cube.js

Cube.js 是一个开源的分析框架&#xff0c;专为构建数据应用和分析工具而设计。它的主要目的是简化和加速构建复杂的分析和数据可视化应用。以下是对 Cube.js 的详细介绍&#xff1a; 核心功能和特点 1. 多数据源支持 Cube.js 支持从多个数据源中提取数据&#xff0c;包括 SQ…

怎么给USER新增表空间文件

今天介绍一下docker部署的oralce19c&#xff0c;怎么增加表空间 docker exec -it orcl19c bash 管理员方式登录 sqlplus / as sysdba 增加表空间脚本 ALTER TABLESPACE USERS ADD DATAFILE /opt/oracle/oradata/newdatafile6.dbf SIZE 30720M AUTOEXTEND ON NEXT 10M MAXSIZE…

Linux内核:哈希表hlist_head和hlist_node

linux内核中哈希表使用链接法实现哈希表&#xff0c; 结构体有hlist_head和hlist_node&#xff0c;hlist指向hlist_node。 哈希表具体如下&#xff1a; 以哈希表删除为例&#xff1a; 为什么要使用二级指针&#xff1f;