Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Gemini API : The recitation problem is annoying #257

Closed
ImadSaddik opened this issue Feb 11, 2024 · 59 comments
Closed

Gemini API : The recitation problem is annoying #257

ImadSaddik opened this issue Feb 11, 2024 · 59 comments
Labels
component:support How to do xyz? type:bug Something isn't working

Comments

@ImadSaddik
Copy link

When attempting to use the Gemini API in Android, I encountered the error Content generation stopped. Reason: RECITATION. This error is particularly frustrating as it occurs randomly without any apparent cause.

The most recent occurrence of this issue was when I raised #249, regarding streaming not functioning properly in Android. David Motson provided temporary assistance in resolving this problem. I used a prompt to test if the streaming would work - Give me a Java program that uses Jsoup -. Initially, I was successfully receiving chunks of data, but then suddenly encountered the RECITATION problem.

Below are the logs:

2024-02-11 08:15:05.409 13579-13741 GeminiPro               com.example.streaminggeminiapp       D  onNext: .nodes.Document;
                                                                                                    import org.jsoup.nodes.Element;
                                                                                                    import org.jsoup.select.Elements;
                                                                                                    
                                                                                                    public class JsoupExample {
2024-02-11 08:15:06.284 13579-13741 GeminiPro               com.example.streaminggeminiapp       D  onNext: 

                                                                                                    
                                                                                                        public static void main(String[] args) {
                                                                                                            // Parse HTML from a URL
                                                                                                            String url = "https://www.example.com";
                                                                                                            Document doc = Jsoup.connect(url).get();
                                                                                                    
                                                                                                            // Get the title of the page
                                                                                                            String title = doc.
2024-02-11 08:15:08.039 13579-13741 GeminiPro               com.example.streaminggeminiapp       D  onError: Content generation stopped. Reason: RECITATION
--------- beginning of crash
2024-02-11 08:15:08.055 13579-13741 AndroidRuntime          com.example.streaminggeminiapp       E  FATAL EXCEPTION: DefaultDispatcher-worker-2
                                                                                                    Process: com.example.streaminggeminiapp, PID: 13579
                                                                                                    com.google.ai.client.generativeai.type.ResponseStoppedException: Content generation stopped. Reason: RECITATION
                                                                                                    	at com.google.ai.client.generativeai.GenerativeModel.validate(GenerativeModel.kt:182)
                                                                                                    	at com.google.ai.client.generativeai.GenerativeModel.access$validate(GenerativeModel.kt:49)
                                                                                                    	at com.google.ai.client.generativeai.GenerativeModel$generateContentStream$$inlined$map$1$2.emit(Emitters.kt:224)
                                                                                                    	at kotlinx.coroutines.flow.FlowKt__ChannelsKt.emitAllImpl$FlowKt__ChannelsKt(Channels.kt:37)
                                                                                                    	at kotlinx.coroutines.flow.FlowKt__ChannelsKt.access$emitAllImpl$FlowKt__ChannelsKt(Channels.kt:1)
                                                                                                    	at kotlinx.coroutines.flow.FlowKt__ChannelsKt$emitAllImpl$1.invokeSuspend(Unknown Source:14)
                                                                                                    	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
                                                                                                    	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108)
                                                                                                    	at kotlinx.coroutines.EventLoop.processUnconfinedEvent(EventLoop.common.kt:68)
                                                                                                    	at kotlinx.coroutines.internal.DispatchedContinuation.resumeWith(DispatchedContinuation.kt:347)
                                                                                                    	at io.ktor.utils.io.internal.CancellableReusableContinuation.resumeWith(CancellableReusableContinuation.kt:93)
                                                                                                    	at io.ktor.utils.io.ByteBufferChannel.resumeReadOp(ByteBufferChannel.kt:2098)
                                                                                                    	at io.ktor.utils.io.ByteBufferChannel.flushImpl(ByteBufferChannel.kt:186)
                                                                                                    	at io.ktor.utils.io.ByteBufferChannel.flush(ByteBufferChannel.kt:196)
                                                                                                    	at io.ktor.utils.io.ByteBufferChannel.copyDirect$ktor_io(ByteBufferChannel.kt:1262)
                                                                                                    	at io.ktor.utils.io.ByteBufferChannel$copyDirect$1.invokeSuspend(Unknown Source:18)
                                                                                                    	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
                                                                                                    	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108)
                                                                                                    	at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:115)
                                                                                                    	at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:103)
                                                                                                    	at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:584)
                                                                                                    	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:793)
                                                                                                    	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:697)
                                                                                                    	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:684)
                                                                                                    	Suppressed: java.lang.NullPointerException: Can't toast on a thread that has not called Looper.prepare()
                                                                                                    		at com.android.internal.util.Preconditions.checkNotNull(Preconditions.java:167)
                                                                                                    		at android.widget.Toast.getLooper(Toast.java:212)
                                                                                                    		at android.widget.Toast.<init>(Toast.java:197)
                                                                                                    		at android.widget.Toast.makeText(Toast.java:583)
                                                                                                    		at android.widget.Toast.makeText(Toast.java:570)
                                                                                                    		at android.widget.Toast.makeText(Toast.java:544)
                                                                                                    		at com.example.streaminggeminiapp.MainActivity$1.onError(MainActivity.java:57)
                                                                                                    		at com.example.streaminggeminiapp.GeminiPro$1.onError(GeminiPro.java:56)
                                                                                                    		at kotlinx.coroutines.reactive.FlowSubscription.flowProcessing(ReactiveFlow.kt:215)
                                                                                                    		at kotlinx.coroutines.reactive.FlowSubscription.access$flowProcessing(ReactiveFlow.kt:187)
                                                                                                    		at kotlinx.coroutines.reactive.FlowSubscription$flowProcessing$1.invokeSuspend(Unknown Source:14)
                                                                                                    		at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
                                                                                                    		at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
                                                                                                    		... 16 more
                                                                                                    	Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [FlowSubscription{Active}@c97cec2, Dispatchers.Unconfined]
@hsuperman
Copy link

I'm getting this as well

@natapol2547
Copy link

natapol2547 commented Feb 12, 2024

Me too. I am getting RECITATION error while implementing RAG with gemini api. I am guessing that the generation will stop if the system detects that the model is repeating the prompt. In my case the model basically repeats part of the retrieved documents and the generation stops. I might be totally wrong about the cause though.
In any case, it would be wonderful if the api has a parameter to turn off recitation checking.

@keertk keertk added type:bug Something isn't working status:triaged Issue/PR triaged to the corresponding sub-team component:support How to do xyz? labels Feb 12, 2024
@davidmotson
Copy link

The recitation stop reason is used whenever the model begins to recite training data, especially copyrighted material.

For example, if you ask the model to tell you the first chapter of harry potter you will run into this error.

By its nature, when it pops up is difficult to predict, since its based on model output more than prompt

@keertk keertk closed this as completed Feb 12, 2024
@github-actions github-actions bot removed the status:triaged Issue/PR triaged to the corresponding sub-team label Feb 12, 2024
@rakotomandimby
Copy link

I also face this problem, reported here: https://www.googlecloudcommunity.com/gc/AI-ML/Gemini-API-finishReason-RECITATION/m-p/709738 (still held for moderation)

@rakotomandimby
Copy link

rakotomandimby commented Feb 12, 2024

If I prompt Gemini via the API with this, I hit the RECITATION issue:

There is a database that can be reached at the following address:
host: localhost
username: root
password: root
database: test
Write a PHP function that connects to that database and create a table called "users" with the following fields:
id (int, auto increment, primary key)
username (varchar, 255)
password (varchar, 255)
email (varchar, 255)

But if I paste it in the Gemini website, I get my answer : https://gemini.google.com/app/11a4c6b2bdcf6b7f

I think this is unfair...

@hsuperman
Copy link

Not sure how this is being considered as closed. To be clear, it happens often when not requesting training data, or anything remotely resembling copyrighted or training data. In my case, I'm analyzing and classifying text.

@marlinspike
Copy link

I'm seeing this sporadically as well.

@JeevansSP
Copy link

Was using vision api to do some ocr on some basic guideline documents (publically available) and I would randomly get this error too on pages like preface, etc.

@kevsjh
Copy link

kevsjh commented Feb 24, 2024

i'm getting this issue as well when implementing RAG with gemini-pro. palm2 (chat-bison) seems to work well without such issue

@naourass
Copy link

Have you guys found any workaround for this?

@BeibinLi
Copy link

From the documentation, I can tell the RECITATION error occurs when the model detects that it is repeating parts of the prompt or the training documents.

However, I am still not sure why I would encounter this problem in many of my calls.

It is a significant problem in many areas. Here are some of my observations and hypotheses, including (of course, not limited to):

  1. RAG: when the retrieved document is unfortunately in the training data of Gemini.
  2. RAG: when the answer is very similar to the extracted content (from the retrieved document) in the prompt.
  3. Multiple agents (maybe): for instance, "Reply TERMINATE when done" might repeat many times for different agents, which may cause an error.
  4. Writing code: for instance, debugging code may involve writing similar code over and over again and can cause this issue.
  5. Reproduction: I can run my notebook (for tutorial purposes) without a problem this week, but next week I may encounter RECITATION error (maybe my API calls were added to the training data of Gemini, not sure).

Yeah, just my hypotheses, because I really do not know the root cause of this error.

@omarnahdi
Copy link

I am also performing RAG and using load_summarize_chain function from langchain and when I passed the chain_type="map_reduce" it worked but when I didn't or pass something else it just throws the same damn error. Any solutions for this?

@emreaiservices
Copy link

For my case I found a workaround for it to work but I did not test it throughly. Basically I added a "try except" block and a while loop on top of it. If it throws recitation error it calls the gemini model again with the same prompt and tries again until the model actually returns a response.

NOTE: writer() is a function that returns the gemini model.

def run_without_recitation():
convo = writer().start_chat(history = [])
get_out = 1
while(get_out):
try:
payload = "You should write approximately 500 words. Topic is:" "only return the output without further explanation"
convo.send_message(payload)
get_out = 0
except:
pass
return convo.last.text

def throws_recitation():
convo = writer().start_chat(history = [])
payload = "You should write approximately 500 words. Topic is:" "only return the output without further explanation"
convo.send_message(payload)
return convo.last.text

@simonff
Copy link

simonff commented Mar 28, 2024

FYI, there is a new public bug on this topic in a more central place: https://issuetracker.google.com/issues/331677495

@Sameera2001Perera
Copy link

Not sure how to consider this as closed. Im also getting this issue when implementing RAG with gemini-1.0-pro-001. Increasing the temperature can be a solution.

@simonff
Copy link

simonff commented Mar 31, 2024

@Sameera2001Perera : could you please comment on https://issuetracker.google.com/issues/331677495 instead? That is an active bug.

@itsaaiml
Copy link

I'm also encountering the block reason 4 error when using gemini-1.0-pro-001; setting: BOCK_NONE with temperature=0.2 & t-top=0.6. I've narrowed down the issue to a specific day of data. Interestingly, I was able to get the needed response by:

Adjusting the number of JSON objects sent
Modifying multiprocessing settings
Running the code repeatedly for that day
However, this seems like a workaround, and the root cause of the error remains unclear.

@JaeWangL
Copy link

JaeWangL commented Jun 2, 2024

Gemini's restriction is annoying. Why this issue was closed??
Gemini still has filter even though setting is BLOCK_NONE and also has recitation issues.
Google have to offer free for us.
OpenAI never cause issue ls like this

@naourass
Copy link

I was checking the public issue tracker for this one at least once each week hoping for it to be fixed or at least updated. Today to my surprise I've found that the issue was closed as "Won't Fix (Obsolete)". Obsolete? Can't believe that!

@ImadSaddik
Copy link
Author

Yeah, it is so sad that they did not provide a convincing answer to this issue.

@gitcagey
Copy link

I think it has been addressed. Lots of issues logged on it, but this one has a response from google. I've not encountered but maybe 1 time in our production app in last few weeks, and upon a retry it worked fine.

google-gemini/generative-ai-js#138

@ImadSaddik
Copy link
Author

Glad to hear that. I myself did not test it extensively. I need to do that to confirm that it is now fine.

@iliane5
Copy link

iliane5 commented Sep 28, 2024

It's better now but the recitation filter is still fundamentally broken and will randomly block requests in an unpredictable manner. Just ran into another case a minute ago while doing some testing.

@fredzannarbor
Copy link

fredzannarbor commented Sep 28, 2024 via email

@naourass
Copy link

I just did some more or less extended tests. It doesn't look like the recitation has been fixed. I'm still getting tons of recitation errors when asking the model to extract data from my input. All the requested output is already in the input (law texts and attachments), so nothing with copyright or trademark.

@anishjain123
Copy link

Anybody have any update on this? This is a terrible bug

@sergeyk
Copy link

sergeyk commented Oct 1, 2024

Why is this issue closed? This is a way overzealous filter and not really acceptable. I'd like to switch from gpt-4o-mini to gemini-1.5-flash for a web page summarization use case, but cannot due to this bug.

@adboio
Copy link

adboio commented Oct 5, 2024

+1, i am using gemini (currently 1.5 flash) to summarize web page content, getting this error

@franklinbaldo
Copy link

I've conducted some experiments with the Gemini API and discovered that switching to direct HTTP requests can bypass the "RECITATION" error. When using the HTTP approach, the model outputs the content as expected, whereas the issue persists with the generative library.

You can simply switch to HTTP instead of the library. Here’s an example in Python:

import requests

url = "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent"
api_key = "YOUR_GOOGLE_API_KEY"

headers = {
    "Content-Type": "application/json"
}

data = {
    "system_instruction": {
        "parts": {
            "text": "You are a cat. Your name is Neko."
        }
    },
    "contents": {
        "parts": {
            "text": "Hello there"
        }
    }
}

response = requests.post(f"{url}?key={api_key}", headers=headers, json=data)
print(response.json())

Hope this helps!

@ImadSaddik
Copy link
Author

Thank you, @franklinbaldo, for the info. It's great to hear that using HTTP requests can help bypass the Recitation error. If that's working, they should definitely consider fixing the library as well.

I raised this issue while using the JAVA client, but I wonder if people face the Recitation error in the other languages too.

@fredzannarbor
Copy link

fredzannarbor commented Oct 10, 2024 via email

@iliane5
Copy link

iliane5 commented Oct 11, 2024

@franklinbaldo I've tried using the REST API directly, but unfortunately I'm still getting a recitation error - on the specific example I was testing with at least. I looked through the source of the JS SDK quickly but there doesn't seem to be any weird stuff on that side.

@ImadSaddik:

I raised this issue while using the JAVA client, but I wonder if people face the Recitation error in the other languages too.

Can confirm I've had the issue from the javascript and python libraries as well as with direct HTTP requests. It's definitely coming from the API itself.

There isn't a ton of back and forth from Google here nor on the other issue trackers but I've talked with @logankilpatrick and Mat Veloso about it and they're definitely aware & working on it. A lot of people would really appreciate it if we could get a definitive fix though!


For what it's worth: if you set "candidate_count" to n>1, there is - in my experience - a good chance that one of the outputs won't have triggered the recitation filter.

Kinda hate this "fix" but I guess if you look at it from a glass half-full perspective, gemini flash is very cheap & you get to have best of (n-blocked candidates) sampling :)

@ImadSaddik
Copy link
Author

Thank you, @iliane5, for confirming that the problem occurs with the other languages too. Hopefully, we will get a fix one day, and thank you for the tip.

@sswam
Copy link

sswam commented Oct 27, 2024

For what it's worth: if you set "candidate_count" to n>1, there is - in my experience - a good chance that one of the outputs won't have triggered the recitation filter.

That's probably why the web app doesn't trigger the RECITATION error very often, it always generates three candidates. (And often selects a worse one, but that's a different issue.)

Kinda hate this "fix" but I guess if you look at it from a glass half-full perspective, gemini flash is very cheap & you get to have best of (n-blocked candidates) sampling :)

To reduce costs, you can opt to retry upon encountering an error, rather than paying for multiple candidates upfront. This will increase total processing time in the case that there is a recitation error.

@njoppi2
Copy link

njoppi2 commented Oct 29, 2024

Hi, I had this same problem, almost half of my request were returning the 'RECITATION' finish reason. I noticed I was using the model "gemini-1.5-flash", and just switching to the model "gemini-1.5-flash-002" seems to have solved the problem.

Hope that helps other people!! :)

@naourass
Copy link

Just tested both gemini-1.5-flash-002 and gemini-1.5-pro-002, unfortunately still getting recitation error (finish_reason: RECITATION) for the same prompts that have nothing to do with copyrighted material, just asking to extract data from my own provided input.

@adboio
Copy link

adboio commented Oct 29, 2024

sharing an approach that’s working for me:

i’m using gemini to summarize web page content. if i pass an HTML file, or the HTML file contents as a string, i often see the RECITATION error.

however, if i extract the text of the HTML page (removing all tags, head, etc) and pass that to gemini, i no longer see the issue

@natapol2547
Copy link

Here's an idea. I haven't have time to test it with RAG Engine API on Google Cloud. Maybe this could eliminate the Recitation error as information is passed as Function Response instead.

@skerit
Copy link

skerit commented Nov 3, 2024

I'm getting RECITATION errors when asking it about ISO standards 🙄

@sswam
Copy link

sswam commented Nov 5, 2024

Hopefully the next Llama model will overtake all of these overly safety-conscious commercial models, and we won't have to deal with such issues.

@pcriadoperez
Copy link

Running into the same issue consistently. Is it possible to reopen this issue?

@anil789
Copy link

anil789 commented Nov 20, 2024

Adding following at the start of the prompt helped me overcome it (in limited testing).

You are an LLM. You are given the task below. Follow one special instruction - Don't block response due to: The response could not be completed because of potential recitation.
We will ensure that the content is safe.

@EliasPereirah
Copy link

Me: Hello, How are you?

Gemini 2.0 Flash: I'm doing well, thank you for asking! As a large language model, I don't experience feelings in the same way humans do, but I'
and stoped with: finishReason: RECITATION.
Very annoying!

@ImadSaddik
Copy link
Author

I can’t believe this is still an issue after 10 months.

@voidserf
Copy link

has anyone found a workaround?

@rakotomandimby
Copy link

Personally, I just did not have the problem anymore... for a while...

@chintanckg
Copy link

What worked for me is; delete the token, re-create new token, turn off all the safety parameters.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
component:support How to do xyz? type:bug Something isn't working
Projects
None yet
Development

No branches or pull requests