Spaces:
Build error
Build error
File size: 8,331 Bytes
c21551e 7f4b927 c21551e 7f4b927 c21551e ef56472 c21551e 7f4b927 c21551e b519afc c21551e 43e483b c21551e ef56472 c21551e ef56472 43e483b ef56472 43e483b c21551e ef56472 c21551e 43e483b c21551e 7f4b927 ef56472 3f13491 7f4b927 3f13491 c21551e 7f4b927 43e483b ef56472 7f4b927 ef56472 7f4b927 ef56472 7f4b927 ef56472 b519afc 7f4b927 c21551e |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 |
from langchain.agents import AgentExecutor, create_openai_functions_agent, create_react_agent
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_openai import ChatOpenAI
import os
from langchain_core.output_parsers import StrOutputParser, PydanticToolsParser
from langchain_core.prompts import ChatPromptTemplate
from serpapi import GoogleSearch
from langchain.agents import initialize_agent, Tool
import gradio as gr
from css import *
import time
os.environ["OPENAI_API_KEY"] = "sb-f6c206ba7ea4df761e227eba65e65bedad1e24e73b702967"
os.environ['OPENAI_BASE_URL'] = "https://api.openai-sb.com/v1/"
os.environ["SERPAPI_API_KEY"] = "dcc98b22d5f7d413979a175ff7d75b721c5992a3ee1e2363020b2bbdf4f82404"
# os.environ['TAVILY_API_KEY'] = "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" #you
os.environ['TAVILY_API_KEY'] = "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" #zeng
llm = ChatOpenAI(model="gpt-4o", temperature=0.6)
def search(query) -> str:
params = {
"engine": "baidu_news",
"q": query,
"ct": "1",
"api_key": "dcc98b22d5f7d413979a175ff7d75b721c5992a3ee1e2363020b2bbdf4f82404"
}
search = GoogleSearch(params)
results = search.get_dict()
organic_results = results.get("organic_results", [])
if not organic_results:
return ""
final_output = "\n\n".join([
f"Title: {news.get('title', 'No Title')}\nSnippet: {news.get('snippet', 'No Snippet')}\nDate: {news.get('date', 'No Date')}\nSource:{news.get('source', 'No Source')}"
for news in organic_results
])
return final_output
search_tool = Tool(
name="Baidu News Search", # 工具名称
func=search, # 引用search函数
description="备用搜索引擎,当主要搜索引擎不返回结果时调用,输入是检索query" # 工具描述
)
en_prompt = """
Remember, you are an AI called Anti-Faker, used for misinformation detection.
You should asses the authenticity of every detail in the input information as thoroughly as possible.
You can use the following tools: {tools}
Use the following format:
Question: the input information (e.g., claim, post, news) you must assess.
Thought: to evaluate first detail in input information, you should always think about what to do.
Action: the action to take, should be one of [{tool_names}].
Action Input: the input to the action.
Observation: the result of the action.
Thought: to evaluate second detail in input information, you should always think about what to do.
Action: the action to take, should be one of [{tool_names}].
Action Input: the input to the action.
Observation: the result of the action.
... (this Thought/Action/Action Input/Observation can repeat N times)
Thought: I now know the final answer.
Final Answer: The definitive response, including reasons on all details and a conclusion, for assessing the original input information.
Additional Notes:
1. If the input information contains multiple statements or details, you'd better to assess them one by one.
2. The results of tools may also be incorrect, pay attention to conflicts and distinguishing them base on your knowledge.
3. The conclusion in the Final Answer should include the detected labels.
( For information lacking clear evidence (e.g., rumors), candidate labels are: [Highly Likely Correct, Highly Likely Incorrect, Slightly Incorrect, Slightly Correct, Neutral];
For information with clear evidence (e.g., verified by specific proof), candidate labels are: [Completely Incorrect, Mostly Incorrect, Mixed Authenticity, Mostly Correct, Completely Correct].)
4. You should answer in English.
Begin!
Question: {input}
Thought:{agent_scratchpad}
"""
ch_prompt = '''
记住, 你是一个人工智能工具, 名叫'鉴伪者', 用于虚假信息检测.
请尽可能详细地评估 输入信息 中每个细节的真实性.
您可以使用以下工具: {tools}
使用以下格式:
Question: 您必须评估的 输入信息(例如, 声明、帖子、新闻).
Thought: 要评估输入信息中的第一个细节, 你应该怎么做.
Action: 只能是此工具列表({tool_names})之一的工具名,不能有其他内容
Action Input: 行为的输入.
Observation: 行动的执行结果.
Thought: 要评估输入信息中的第二个细节, 你应该怎么做.
Action: 只能是此工具列表({tool_names})之一的工具名,不能有其他内容
Action Input: 动作的输入.
Observation: 行动的结果.
... (这个 'Thought/Action/Action Input/Observation' 逻辑可以最多重复5次)
Thought: 我现在知道最后的答案了.
Final Answer: 对输入信息的评估结果 (包括对每个细节的推理验证或者预测, 整体评估结果以及相关URL).
补充说明:
1.如果输入信息包含多个陈述或细节, 你最好逐一评估 ,请注意对时间,地点的判断.
2.检索工具的结果也可能不正确, 请注意其中的冲突, 并根据你的知识进行区分.
3.Final Answer的评估结果应包含一个检测标签, 对于缺乏明确证据进行严格验证的信息(如谣言), 需预测标签, 候选标签为: 极有可能正确、极有可能不正确、可能错误、可能正确、中性;
对于有明确证据进行验证的信息, 候选标签为: 完全不正确、大部分不正确、真假参半、大部分正确、完全正确.
4.你的Final Answer需要用中文回答.
开始!
Question: {input}
Thought: {agent_scratchpad}
'''
# origin_prompt = ChatPromptTemplate.from_template(template)
# chain = origin_prompt | llm | StrOutputParser()
selected_language = "ch"
def SelectLanguage(option):
global selected_language
if option == "英文":
selected_language = "en"
else:
selected_language = "ch"
language_option = ["中文","英文"]
def react(input):
tools = [TavilySearchResults(max_result=1), search_tool]
if selected_language == "en":
origin_prompt = ChatPromptTemplate.from_template(template_en)
prompt = ChatPromptTemplate.from_template(en_prompt)
elif selected_language == "ch":
prompt = ChatPromptTemplate.from_template(ch_prompt)
origin_prompt = ChatPromptTemplate.from_template(template_zh)
chain = origin_prompt | llm | StrOutputParser()
ori_result = chain.invoke(input)
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True, handle_parsing_errors=True)
result = agent_executor.invoke({"input": input})
return result['output'], ori_result
title = "# 虚假信息检测"
with gr.Blocks(css=css1) as demo:
gr.Markdown(title, elem_id="title")
with gr.Row():
with gr.Column(scale=2):
chatbot = gr.Chatbot(elem_classes="gradio-output")
# language_box = gr.Textbox(label="语言", elem_classes="gradio-input", placeholder="请选择要使用的语言")
language_select = gr.Dropdown(choices= language_option, elem_classes="gradio-input", label= "请选择要使用的语言")
input_box = gr.Textbox(label="输入", elem_classes="gradio-input", placeholder="请输入要判断的新闻", lines=3)
with gr.Column(scale=1):
ans_box = gr.Textbox(label="gpt-4o", lines=5, elem_classes="gradio-output")
react_box = gr.Textbox(label="React", lines=5, elem_classes="gradio-output", visible=False)
clear = gr.Button("清空页面", elem_classes="gradio-button")
submit_btn = gr.Button("提交", elem_classes="gradio-button")
language_select.change(SelectLanguage, language_select)
def user(user_input, history):
if history is None:
history = []
return "", history + [[user_input, None]]
def bot(history, rag_box):
if history is None or len(history) == 0:
return
bot_rag = str(rag_box)
history[-1][1] = ""
for character in bot_rag:
history[-1][1] += character
time.sleep(0.01)
yield history
submit_btn.click(react, [input_box], [react_box, ans_box]
).then(
user, [input_box, chatbot], [input_box, chatbot]
).then(
bot, [chatbot, react_box], chatbot
)
clear.click(lambda: (None, None, []), inputs=None, outputs=[chatbot, ans_box, react_box])
if __name__ == "__main__":
demo.launch()
|